MappedByteBufferの使用を検討しましたか?これにより、ファイルを1回解析し、メモリに最適化されたバイナリバージョンをsdcardに書き込んで、チャンクで高速に読み戻すことができます。
// Open the file here, store it in a field
RandomAccessFile file = null;
try {
mFile = new RandomAccessFile("/sdcard/reallyLargeFile.dat", "r");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
レンダリングしたい場所で、これを行います:
for (int offset = 0; offset < POINTS_SIZE; offset += BLOCK_SIZE)
if (file != null)
try {
MappedByteBuffer buffer = file.getChannel().map(FileChannel.MapMode.READ_ONLY, offset, BLOCK_SIZE);
vertexBuffer.put(buffer);
vertexBuffer.position(0);
// Render here
} catch (IOException e) {
e.printStackTrace();
}
ここで、POINTS_SIZE=ポイントの総数*4(=フロートのサイズ)およびBUFFER_SIZEは、アプリケーションをクラッシュさせない(分割可能な)サイズです。これはシングルスレッドソリューションであり、より小さなバッファを同時に読み取る複数のスレッドを使用することでコストを償却できる可能性があることに注意してください。また、これは実際には一連のシークと読み取りと同じくらい効率的であることが判明するかもしれませんが、はるかにエレガントで保守可能なコードを生成します。また、メモリマップトファイルが多くのマシンのパフォーマンスを向上させる可能性もあります。
お役に立てれば。