Эффективный способ чтения, загрузки и выгрузки в память частей очень большого двоичного файла в Java. - PullRequest
0 голосов
/ 24 апреля 2018

Мне нужно прочитать содержимое двоичного файла, содержащего числа с плавающей точкой, которые представляют позиции большого числа частиц, и передать эту информацию в мою программу, чтобы их можно было отобразить на экране.Файл содержит положение каждой частицы в каждом кадре и, следовательно, может достигать 10 и более ГБ.

Мой план - заполнить всю доступную память следующими кадрами, которые понадобятся программе.После того, как кадр был показан, мне нужно освободить это пространство и загрузить новый кадр из файла.Если запрашивается определенный кадр (скажем, кадр 12), мне нужно перейти к этому кадру в файле и прочитать его, а также все последующие кадры, которые помещаются в памяти.

Вопрос в том,Как я могу прочитать, а затем сохранить эту информацию эффективным способом?

Я провел некоторое исследование и прочитал похожие вопросы.Массивы и векторы не являются опцией, так как они могут вместить около 2 ГБ данных, когда я мог бы загружать больше, чем это для оперативной памяти.Кроме того, инициализация массива такого размера, по-видимому, приводит к «исключению нехватки памяти», а расширение массива занимает слишком много времени.

Буфер большого файла;BufferedInputStream ограничено 2 ГБ;Массивы, ограниченные 2 ^ 31 байтами

MappedByteBuffer может быть вариантом, но он также ограничен 2 ГБ, и я не совсем понимаю, как это работает.

Я мог бы такжеиспользовать внешние библиотеки, которые сохраняют данные вне буфера (но в какую?), или использовать ByteBuffer, я думаю, но какой вариант лучше в этом случае?

Короче, мне нужно прочитать файлбыстро (вероятно, по частям, если нет другого пути), и сохранить как можно больше в памяти, и передать эту информацию в другой поток, кадр за кадром.Как мне прочитать этот файл и где я храню данные в памяти?

Чтение больших файлов на Java Этот источник, похоже, касается чего-то похожего, но речь идет о чтении текста, икажется, он мог бы использовать MappedByteBuffer или BufferedInputStream, поскольку его файл имеет только 1,5 ГБ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...