Поймано: java.lang.OutOfMemoryError: Пространство кучи Java - Использование -Xmx не применимо - PullRequest
0 голосов
/ 02 августа 2011

Я написал очень сложный сценарий миграции базы данных в Groovy, который отлично работает на моей рабочей станции, но выдает «Caught: java.lang.OutOfMemoryError: Java heap space» при запуске на JVM сервера.JVM застрял как есть (ограниченные ресурсы как стажер), поэтому мне нужно найти другой способ исправить это, кроме увеличения доступной памяти.

Ошибка возникает при доступе к некоторым из самых больших таблиц: особенно большое, но простое соединение (от 200 000 строк до 50 000 строк).Есть ли другой способ подойти к такому соединению, которое избавит меня от ошибки?

Пример запроса:

target.query(""" 
    SELECT 
        a.*, b.neededColumn 
    FROM 
        bigTable a JOIN mediumTable b ON 
    a.stuff = b.stuff 
    ORDER BY stuff DESC 
""") { ResultSet rs ->
    ...
}

Ответы [ 2 ]

2 голосов
/ 02 августа 2011

Можете ли вы запустить объединение в SQL на сервере базы данных?

Если нет, вы, вероятно, застряли в итерации каждого из 200 000 результатов, соединяя его с 50 000 строк и записывая результаты (так что вы не сохраняете более 1 * 50 000 результатов в памяти одновременно)

Или, если у вас есть доступ к нескольким машинам, вы можете разделить свои 200 000 элементов на блоки и сделать один блок на машину?

Редактировать

Используя ваш пример кода, вы должны уметь:

new File( 'output.csv' ).withWriter { w ->
  target.eachRow( '''SELECT a.a, a.b, a.c, b.neededColumn FROM
    bigTable a
    JOIN mediumTable b ON a.stuff = b.stuff
    ORDER BY stuff DESC''' ) { row ->
    w.write "$row.a,$row.b,$row.c,$row.neededColumn"
  }
}

Это запишет каждую строку в файл output.csv

1 голос
/ 02 августа 2011

Вы должны изменить свой код так, чтобы строки не загружались все в память одновременно (то есть поток данных, работа с каждой строкой по одному за раз). Насколько я знаю, Groovy все еще не делает этого, когда вы используете такие вещи, как collect, поэтому перепишите его, чтобы использовать цикл for.

...