Ошибка памяти виртуальной машины Java, java.lang.OutOfMemoryError: пространство кучи JavaJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Ошибка памяти виртуальной машины Java, java.lang.OutOfMemoryError: пространство кучи Java

Сообщение Anonymous »

Друзья, нужна ваша помощь, мне приходится обрабатывать очень большой файл с информацией (около файла весит 30 Мб). При обработке этого информационного файла Java выдает следующую ошибку:

Код: Выделить всё

Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError:  Java heap space
at java.util.Arrays.copyOf(Arrays.java:2367)
at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:130)
at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:114)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:535)
at java.lang.StringBuffer.append(StringBuffer.java:322)
at java.io.StringWriter.write(StringWriter.java:94)
at java.io.Writer.write(Writer.java:127)
at com.sun.org.apache.xml.internal.serialize.Printer.printText(Printer.java:170)
.....
Мой код:

Код: Выделить всё

...

public Document generateXML(File file, String type) {
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = dbf.newDocumentBuilder();

Document document = docBuilder.newDocument();
Element rootElement = document.createElement("data");
document.appendChild(rootElement);

Element informacionElement = document.createElement("information");
rootElement.appendChild(informacionElement);

Element entityElement = document.createElement("entity");
entityElement.appendChild(document.createTextNode("ANYTHING"));
informacionElement.appendChild(entityElement);

Element entityCode = document.createElement("code");
entityCode.appendChild(document.createTextNode(0000));
informacionElement.appendChild(entityCode);

Element fileElement = document.createElement("FILENAME");
fileElement.appendChild(document.createTextNode(file.getName()));
informacionElement.appendChild(fileElement);

Element detailElement = document.createElement("detail");
rootElement.appendChild(detailElement);

Path path = Paths.get(file.getAbsolutePath());
Scanner tmpFile = new Scanner(path, StandardCharsets.UTF_8.name());

String[] tmpTags = keyXml.get(type);
int row = 1;

while (tmpFile.hasNextLine()) {

Element rowElement = document.createElement("row");
filaElement.setAttribute("id", Integer.toString(row));

Scanner tmpLine = new Scanner(tmpFile.nextLine());
tmpLine.useDelimiter("\\|");
int index = 0;
while (tmpLine.hasNext()) {
Element element = document.createElement(tmpTags[index]);
String text = tmpLine.next().trim();
element.appendChild(document.createTextNode(text));
filaElement.appendChild(element);
++index;
}
detailElement.appendChild(filaElement);
++fila;
}
return document;
} catch (ParserConfigurationException | IOException ex) {
Logger.getLogger(HandlerXML.class.getName()).log(Level.SEVERE, null,  ex);
}
return null;
}
...
Этот код создает следующий XML-документ:

Код: Выделить всё

    

ANYTHING
0000
filename_XXX



0099
2014
05
0015
06
06
000000000099907
098026
00000781.40
E
000000006804750
xxx
xxxx
xxx


xx
xxx
1014
05
11111
1014
00000000000000000000
3
20101
00000000
46671
1
N


A







............




слово, в котором получены XML-данные:

**0099|2014|05|0015|06|06 |00000000003101|066671|000077777.00|E|000000002719415|xxx|xxxxxx |хххххххх | | |хххххх | |1014|05|12254758|1014|00000000000000000000|3|20101|00000000|748596|1|X| | |В| | | | | **

Теперь представьте, что XML должен быть сгенерирован для 100000 строк информации, и, если вам интересно, все строки должны быть преобразованы в формат XML. >

Проблема в том, что когда вы преобразуете объект в STRING в DOCUMENT, я получаю показанную ранее ошибку: функция, которую я использую для преобразования DOCUMENT для STRING:

Код: Выделить всё

    private static String convertDocumentToString(Document doc) {
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer;
try {
transformer = tf.newTransformer();
StringWriter writer = new StringWriter();
transformer.transform(new DOMSource(doc), new StreamResult(writer));
return writer.getBuffer().toString();
}
catch (TransformerException e) {}
return "";
}
Теперь эта ошибка связана с виртуальной памятью, и обходной путь Java VM заключается в увеличении памяти с помощью -Xmx####m, но мне интересно, если это решается другим способом, попробуйте обработать тип данных с помощью: String, StringBuilder и byte. Может ли кто-нибудь решить этот вопрос?

Заранее спасибо.

Подробнее здесь: https://stackoverflow.com/questions/257 ... heap-space
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Весенняя загрузка Java - java.lang.OutOfMemoryError: пространство кучи Java [дубликат]
    Гость » » в форуме JAVA
    0 Ответы
    93 Просмотры
    Последнее сообщение Гость
  • Как бороться с ошибкой «java.lang.OutOfMemoryError: пространство кучи Java»?
    Гость » » в форуме JAVA
    0 Ответы
    30 Просмотры
    Последнее сообщение Гость
  • Java.lang.OutOfMemoryError: пространство кучи Java ("-Xmx1280M")
    Anonymous » » в форуме JAVA
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • Как я могу преодолеть этот контекст «java.lang.OutOfMemoryError: пространство кучи Java»?
    Anonymous » » в форуме JAVA
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • Как бороться с ошибкой «java.lang.OutOfMemoryError: пространство кучи Java»?
    Anonymous » » в форуме JAVA
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»