Вы смотрели на использование MappedByteBuffer ? Это должно позволить вам один раз проанализировать файл и записать двоичную версию, оптимизированную для памяти, на 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 - это (делимый) размер, который не приводит к сбою приложения. Обратите внимание, что это однопоточное решение, и может быть возможно амортизировать ваши затраты, используя несколько потоков, считывающих меньшие буферы одновременно. Кроме того, хотя на практике это может показаться столь же эффективным, как и поиск и чтение, оно дает гораздо более элегантный и поддерживаемый код. Также вполне возможно, что отображаемые в память файлы могут обеспечить повышение производительности на многих машинах.
Надеюсь, это поможет.