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

Я последовательно обрабатываю большой файл, и я хотел бы сохранить большой кусок его в памяти, 16 ГБ оперативной памяти, доступной в 64-битной системе.

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

Ответы [ 5 ]

3 голосов
/ 27 сентября 2008

Рассматривали ли вы MappedByteBuffer в java.nio? Это у меня над головой, но, возможно, это то, что вы ищете.

3 голосов
/ 27 сентября 2008

Как насчет того, чтобы позволить ОС справиться с буферизацией файла? Вы проверили, как влияет на производительность не копирование всего файла в память JVM?

РЕДАКТИРОВАТЬ: Затем вы можете использовать RandomAccessFile или FileChannel для эффективного считывания необходимых частей файла в память JVM.

1 голос
/ 27 сентября 2008

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

С точки зрения производительности вам будет гораздо лучше обслуживать байты вне JVM (передача огромных порций данных между ОС и JVM относительно медленная). Вы можете достичь этой цели, используя MappedByteBuffer, поддерживаемый прямым блоком памяти.

Вот подходящий тип статьи: статья

1 голос
/ 27 сентября 2008

Я сомневаюсь, что буферизация более 2 Гб за раз будет огромной победой в любом случае. В зависимости от объема обработки, которую вы делаете, вы можете читать почти так же быстро, как вы обрабатываете. Чтобы ускорить его, вы можете попробовать использовать двухпоточную модель «производитель-потребитель» (один поток читает файл и передает данные другому потоку для обработки).

0 голосов
/ 27 сентября 2008

Я думаю, что есть 64-битные JVM, которые будут поддерживать нестандартные ограничения.

Вы можете попробовать буферизовать куски.

...