2010-09-09 3 views
0

При написании больших объемов данных в файл с помощью Java, как можно избежать куч памяти Java из пространства ошибки из встречающихся? .. Это вызывает некоторые сбои в моей программе ..емкость динамической памяти Java

С уважением ,

magggi

+3

Оставьте ваш код, мы сможем помочь вам исправить его. –

+0

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

+1

Можете ли вы написать в свой поток файлов при создании контента? Другими словами, вместо добавления к строке вы можете просто написать в выходной поток? Это типичное решение - вы не хотите использовать много памяти, если не будете абсолютно необходимы. – dlongley

ответ

0

Используйте параметр -Xmx при запуске программы Java, чтобы установить максимальный размер кучи:

java -Xmx256M com.foo.MyClass 
+2

Если файл такой огромный, выделение большего объема памяти - это не лучший способ справиться с этим. –

+0

Обратите внимание, что исходное утверждение было довольно расплывчатым. Я склонен давать короткие и простые ответы, когда контекст не определен. Даже не упоминалось, что он может изменить программу. Я заметил, что StackOverflowers всегда предпочитают «самое чистое» решение (без учета сложности) по простому, прямолинейному, но немасштабируемому/медленному/иногда-неправильному решению. Когда контекст вопроса не определен, возможно, я должен всегда давать 2 ответа: взлом и хорошая практика. – gawi

0

Пробовал ли вы передавать параметры памяти в приложение при запуске?

Например, следующее устанавливает максимальный объем памяти до 1 Гб

java -Xms512m -Xmx1024m myClass 
2

Ваша проблема заключается в том, что вы используете один StringBuffer для обработки всего содержимого. Вы должны чаще пытаться обновлять свои данные. Вы получите производительность и память.

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


Не рекомендуется в вашем случае

Если вы все еще хотите использовать StringBuffer и промойте его только один раз, то вам придется увеличить пространство кучи с -Xmx***M опции по команде java ,


Ресурсы:

На эту же тему:

0

Несколько вариантов

  1. Увеличение Java Heap Size с помощью параметра -Xmx JVM. После -Xmx напишите количество мегабайт, которые ваша программа должна успешно выполнить.

  2. Использование Streaming. Вычислите следующие N байтов в файле, а затем напишите их, используя свой FileOutputStream, выбросив их перед вычислением следующих N байтов. Дополнительный код будет необходим, чтобы узнать, как и как это будет работать для вашей программы.

Edit: Из того, что вы говорите, это звучит, как вы могли бы обернуть FileOutputStream в BufferedOutputStream, падение StringBuffer целиком и просто написать непосредственно в BufferedOutputStream.

1

Из ваших комментариев это звучит так, как будто вы повторяете некоторые объекты, которые заполняют StringBuffer, и после того, как вы закончите итерацию, вы очищаете весь StringBuffer до файла. Вместо этого вы можете либо напрямую писать в выходной поток на каждой итерации (рекомендуется), либо на каждой итерации писать в свой StringBuffer, очищать его до выходного потока, а затем очищать StringBuffer для следующей итерации (не рекомендуется). Это должно снизить использование памяти.

Я не рекомендую увеличивать размер кучи - это не похоже на правильное решение этой проблемы.

Смежные вопросы