Я изо всех сил пытаюсь перенести программу Perl на Java и изучать Java, когда я иду. Центральным компонентом исходной программы является Perl module, который выполняет строковые префиксные поиски в отсортированном текстовом файле +500 ГБ, используя двоичный поиск (по существу, «искать» смещение байта в середине файла, откат до ближайшей новой строки, сравнивать префикс строки с поисковой строкой, «искать» на половину/удвоить это смещение байта, повторить до тех пор, пока не будет найден ...)Двоичный поиск в отсортированном (память-отображенном?) Файле в Java
Я экспериментировал с несколькими решениями для баз данных, но обнаружил, что ничто не сравнится с этим в абсолютной скорости поиска с наборами данных этот размер. Знаете ли вы о какой-либо существующей библиотеке Java, которая реализует такие функции? В противном случае вы могли бы указать мне на какой-то идиоматический пример кода, который делает произвольный доступ для чтения в текстовых файлах?
В качестве альтернативы, я не знаком с новыми (?) Java-I/O-библиотеками, но это будет вариант для карты памяти с текстовым файлом 500 ГБ (я на 64-битной машине с памятью, чтобы сэкономить) и выполнить двоичный поиск в массиве байтов с отображением памяти? Мне было бы очень интересно услышать любой опыт, который вы должны поделиться об этом и аналогичных проблемах.
Не могу поверить, что буферы NIO используют int как смещение, исключающее возможность для использования с более чем 2 ГБ. Это почти глупо на сегодняшних машинах. В этом контексте, так быстро, что это исключает подход в контексте, данном здесь. – dmeister
Обратите внимание, что функция FileChannel.map() занимает много времени, но сам ByteBuffer принимает только ints. Вы можете использовать файлы размером намного больше 2 ГБ, так что любое конкретное отображаемое изображение может быть только 2 ГБ. (для записи у ОС Win32 есть то же ограничение) –
Хорошая точка, Джейсон С. –