Превышен лимит накладных расходов GC при вызове внешнего процесса Python - PullRequest
1 голос
/ 11 марта 2019

У меня есть Java-программа, которая вызывает скрипт Python script.py следующим образом

Process p1 = Runtime.getRuntime().exec("python3 /home/user/script.py " + id + " " + text);
BufferedReader stdInput = new BufferedReader(new InputStreamReader(p1.getInputStream()));
BufferedReader stdError = new BufferedReader(new InputStreamReader(p1.getErrorStream()));
String s;
StringBuilder t = new StringBuilder();
boolean isT = false;
while ((s = stdInput.readLine()) != null) {
    isT = true;
    t.append(s);
}
if (isT) {
    stdInput.close();
    stdError.close();
    p1.destroy();
    return t.toString();
}
logger.info(text);
StringBuilder error_text = new StringBuilder();
while ((s = stdError.readLine()) != null) {
    error_text.append(s);
}
logger.info(error_text.toString());
stdInput.close();
stdError.close();
p1.destroy();
return text;

Этот сегмент кода вызывается в цикле всякий раз, когда выполняется какое-либо условие. Я получаю вывод из Python и собираю его, используя p1.getInputStream().

Сценарий Python выглядит следующим образом

import sys
text = ''
id_ = sys.argv[1]

for w in sys.argv[2:]:
    text += w + ' '

text = text.replace('\n', ' ')

list_ = [text]
ret_val = my_function(list_)
with open('/home/user/output.txt', 'a') as out:
    for r in ret_val:
        print(r)
        out.write(id_ + '\t\t' + r + '\n')

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

Exception in thread "..." java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOfRange(Arrays.java:3664)
    at java.lang.StringBuffer.toString(StringBuffer.java:669)
    at java.io.BufferedReader.readLine(BufferedReader.java:359)
    at java.io.BufferedReader.readLine(BufferedReader.java:389)
Exception in thread "..." java.lang.OutOfMemoryError: GC overhead limit exceeded
    at java.util.LinkedHashMap.newNode(LinkedHashMap.java:256)
    at java.util.HashMap.putVal(HashMap.java:631)
    at java.util.HashMap.put(HashMap.java:612)
    ...

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

Exception in thread "..." java.lang.OutOfMemoryError: GC overhead limit exceeded
Exception in thread "..." java.lang.OutOfMemoryError: GC overhead limit exceeded
Exception in thread "..." java.lang.OutOfMemoryError: GC overhead limit exceeded
Exception in thread "..." java.lang.OutOfMemoryError: GC overhead limit exceeded
Exception in thread "..." java.lang.OutOfMemoryError: GC overhead limit exceeded
Exception in thread "..." java.lang.OutOfMemoryError: GC overhead limit exceeded
Exception in thread "..." java.lang.OutOfMemoryError: GC overhead limit exceeded
Exception in thread "..." java.lang.OutOfMemoryError: GC overhead limit exceeded
Exception in thread "..." java.lang.OutOfMemoryError: GC overhead limit exceeded
Exception in thread "..." java.lang.OutOfMemoryError: GC overhead limit exceeded
Exception in thread "..." java.lang.OutOfMemoryError: GC overhead limit exceeded
Exception in thread "..." java.lang.OutOfMemoryError: GC overhead limit exceeded
...

и мой скрипт на python перестает отвечать.

Я попытался остановить входные потоки с помощью stdInput.close() и stdError.close(), и я убиваю процесс с помощью p1.destroy(), но я думаю, что это не разрушает подпроцессы или есть что-то еще, что я отсутствует, какие еще способы я могу достичь этого.

Спасибо.

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