Java: самый быстрый способ сделать случайные чтения на огромном дисковом файле (файлах)

У меня есть умеренно большой набор данных, приблизительно приблизительно 800 МБ, который является в основном некоторой большой предварительно вычисленной таблицей, что я должен ускорить некоторое вычисление несколькими порядками величины (создающий тот файл занял несколько mutlicores компьютерных дней для создания использования оптимизированного и многопоточного алгоритма... Мне действительно нужен тот файл).

Теперь, когда это было вычислено однажды, что 800 МБ данных только для чтения.

Я не могу держать его в памяти.

На данный момент это - один большой огромный файл 800 МБ, но разделяющий в в меньшие файлы не проблема, если это может помочь.

Я должен считать приблизительно 32 бита данных тут и там в том файле много времени. Я не знаю перед рукой, где я должен буду считать эти данные: чтения равномерно распределены.

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

Действительно ли NIO Java является способом пойти?

Я не знаком с 'файлом с отображенной памятью': Я думаю, что не хочу отображать 800 МБ в памяти.

Все, что я хочу, является самыми быстрыми случайными чтениями, которые я могу получить для доступа к этим 800 МБ находящихся на диске данных.

btw в случае, если люди задаются вопросом, это нисколько не то же как вопрос, который я задал недавно:

Java: быстро находящийся на диске хеш установлен

6
задан Community 23 May 2017 в 10:29
поделиться

3 ответа

На самом деле 800 МБ не очень много. Если у вас 2 ГБ памяти или больше, она может находиться в кэше диска, если не в самом приложении.

1
ответ дан 10 December 2019 в 00:37
поделиться

RandomAccessFile (блокировка) может помочь: http://java.sun.com/javase/6/docs/api/java/io/ RandomAccessFile.html

Вы также можете использовать FileChannel.map () для отображения области файла в память, а затем прочитать MappedByteBuffer .

См. Также: http://java.sun.com/docs/books/tutorial/essential/io/rafs.html

2
ответ дан 10 December 2019 в 00:37
поделиться

800MB - это не так много для загрузки и хранения в памяти. Если вы можете позволить себе иметь многоядерные машины, разрывающие набор данных в течение нескольких дней подряд, вы можете позволить себе дополнительный ГБ или два оперативной памяти, нет?

Тем не менее, прочитайте на Java java.nio.MappedByteBuffer. Из вашего комментария «Я думаю, что не хочу отображать 800 МБ в памяти», что концепция не ясна.

Короче говоря, картографируемый байтовый буфер позволяет программно обращаться к данным, так как они могут находиться на диске или в памяти - это должна решать ОС, поскольку MBB Java основан на подсистеме виртуальной памяти ОС. Это также приятно и быстро. Вы также сможете безопасно получить доступ к одному MBB из нескольких потоков.

Вот шаги, которые я рекомендую вам предпринять:

  1. Создайте экземпляр MappedByteBuffer, который сопоставляет ваш файл данных с MBB. Творение довольно дорогое, так что держите его рядом.
  2. В вашем методе поиска...
    1. создать экземпляр массива байта[4]
    2. вызова .get(byte[] dst, int offset, int length)
    3. массив байтов теперь будет иметь ваши данные, которые вы можете превратить в значение

И presto! У вас есть свои данные!

Я большой поклонник MBB и успешно использовал их для таких задач в прошлом.

6
ответ дан 10 December 2019 в 00:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: