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

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

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

См. stackoverflow.com/questions/140056/… для потенциально связанного вопроса.

Alexander 27.09.2008 01:23
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
1
3 724
5

Ответы 5

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

Обновлено: затем вы можете использовать RandomAccessFile или FileChannel для эффективного чтения необходимых частей файла в память JVM.

Изначально он не был буферизован, java немного читал, обрабатывал, затем читал еще немного. При каждом чтении он будет отправлять запрос ввода-вывода, ждать завершения io. Буферизация ввода увеличивает скорость линейно, чем больше буфер, тем быстрее обработка.

Achille 27.09.2008 01:29

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

Alexander 27.09.2008 01:33

Вы рассматривали MappedByteBuffer в java.nio? Это над моей головой, но, может быть, это то, что вы ищете.

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

Derek Park 27.09.2008 01:21

Есть два вида буфера: один использует байтовый массив, а другой (прямой) использует фиксированное расположение вне кучи Java. К сожалению, размер neight может превышать 2 ГБ. В настоящее время это не исправлено в «дополнительных функциях NIO» (вероятно, в JDK7). Проголосуйте за это. bugs.sun.com/bugdatabase/view_bug.do?bug_id=6347833

Tom Hawtin - tackline 27.09.2008 18:22

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

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

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

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

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

Вот подходящая статья с практическими рекомендациями: статья

Другие вопросы по теме