Запись больших байтовых массивов на лету (чтобы память не стала проблемой) - PullRequest
0 голосов
/ 04 ноября 2011

Я читаю несколько больших файлов в виде байтовых массивов и добавляю их в массив.Плохо ... Я получаю 100 МБ файлов в ПАМЯТИ.Мне нужно, чтобы они обрабатывались и выводились построчно (или через каждое х число строк).Как мне это сделать?BufferedWriter не принимает ByteArrays.

Ответы [ 5 ]

1 голос
/ 04 ноября 2011

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

0 голосов
/ 04 ноября 2011

Работа с данными "на лету", подобная этой, называется streaming . Данные поступают из одного потока, обрабатываются и сохраняются в другом потоке, и вам не нужно помещать все в память.

Если это напрямую из базы данных, ResultSet не извлекает все строки результатов одновременно. Вы можете безопасно перебирать его в цикле и обрабатывать строки «на лету».

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

Откуда вы получаете эти данные, вы можете обрабатывать их «на лету» и записывать в выходные данные. Опять же, пишите не в байтовый массив, а в поток - например, FileOutputStream или Writer.

0 голосов
/ 04 ноября 2011

Если они представляют собой двоичные файлы, то нет смысла говорить о том, чтобы читать их построчно. В любом случае, если вы хотите последовательно обрабатывать большие файлы, не сохраняя их в памяти в целом, вы заинтересованы в потоковой передаче этих файлов. Посмотрите на типы InputStream и OutputStream. И избегайте всех типов с 'ByteArray' в их имени.

0 голосов
/ 04 ноября 2011

Я бы использовал файл с отображением памяти. Таким образом, у вас есть МБ или ГБ "в памяти" без использования большого количества кучи. (несколько КБ).

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

0 голосов
/ 04 ноября 2011

почему вы не используете BufferedReader

если вы используете Java 7, попробуйте nio2 http://download.oracle.com/javase/7/docs/api/java/nio/package-summary.html http://download.oracle.com/javase/7/docs/api/java/nio/file/package-summary.html

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