2011-12-15 11 views
0

私はAndroid 2.2のために開発しています。Android 2.2:大きなファイルからバイナリデータの小さなブロックを読み取る最も良い方法は?

拡張子が既に圧縮されていることが示されていない限り(mp3、png)、資産はデフォルトでAPKで圧縮されます。さらに、Android 2.3より前のバージョンでは、アセットに対して、サイズが1 MB未満の圧縮されていないファイルしか置くことができませんでした。

質問1:res/rawに1.5MBのバイナリファイルを置き、私のプログラムが標準のAndroid ID(R.raw .....)でそれを参照している場合、システムは全体をプルしますメモリにファイル? 1.5MBは圧縮された形で保存されているので、必要と思われます。プログラムが1KBのデータを所与のファイルオフセットからロードするだけで済む可能性があるため、これは不愉快です。これは、アプリのパフォーマンス/速度に重大な影響を与える可能性があります。

私は2つの解決法を参照しています: 1.(ハック)mp3またはpng拡張子を使用してください。私はこの後にメモリ効率の良いアクセスを許可しているとは確信していません(つまり、inputstream.skipbytesなど)。 2.インストール後、アプリケーションの最初の起動時に、アプリケーションはファイルを書き込み可能な作業フォルダSDカード内)。この時点から、R.raw ...ではなく常にそこからファイルにアクセスします。したがって、シーケンシャルリードは確実に機能します。つまり、メモリ使用量は、指定されたファイルオフセットから読み取られた実際のデータ(inputstream.seek実装で使用される一時的なリードバッファは別です。 )。

質問2:バイナリデータを大きなファイルから効率的に読み込むための最良の方法は何ですか?大きなファイルを小さなファイルに分割したくないのですが、それが唯一の方法でない限りです。

答えて

1

私は#2解決策を考えていましたが、線形アクセスを避けるためにRandomAccessFileを使用します。

+0

私は連続して(プログラムのセマンティクスのために努力することなく)順番に最適化することができます。私。 FileInputStreamを開いた後、私はそれが常にオフセットを増やして読むことを解決できます。逆を追う必要はありません。このような場合、skipBytes()を介してすべてのシークを解決できるため、FileInputStream(シークを持たない)が適切です。この場合、RandomAccessFileはFileInputStreamよりも利点がありますか? (おそらく、.seekはskipBytesよりも優れています。ファイル全体を読み込むのではなく、基礎となるOS関数を使用しているからです) –

+0

実装から(http://codesearch.google.com/codesearch#cZwlSNS7aEw/libcore/luni/src/ 'skip()'のように見えるのはシークしても実装されているということです。あなたのケースでは 'FileInputStream'に固執することをお勧めします。 – inazaruk

1

また、ソリューション#2を選択しますが、ランダムアクセスファイルを使用する代わりに、java.nio.MappedByteBufferを使用します。この方法で、バイトバッファーのセマンティックで高速ランダムアクセスが得られます。

+0

いいですね。でも、バイトから読み込み(readInt()など)する必要があります。書き込みが不要なので、FileInputStream/RandomAccessFileが適していると思います。パフォーマンスを考慮すると、RandomAccessFileがFileInputStreamより速い場合、RandomAccessFileはMappedByteBufferと同じ速さでなければならないと考えています(異なるメカニズムを使用するだけです)。 –

+0

わかりません。バイトバッファからプリミティブを取得するのは単なるラッパーメソッド呼び出しです。ストリームでオーバーヘッドが発生せず高速に処理できます(ただし、バイト単位で処理する必要があります) –

関連する問題