Получите R для загрузки данных в переменную из Java, без R, отправляющего информацию обратно в Java
Я загружаю очень большой набор данных в R из Java. Я создал Java-программу, которая вызывает R с использованием jri rJava. Эта программа была упакована в исполняемый файл jar и вызывается из терминала (linux). Данные находятся в области 50 столбцов на 13,7 миллиона строк. Один R может справиться с этим без проблем. Однако, когда я запускаю его из программы на Java, я получаю ошибку Java OutofMemory Heap.
Дело в том, что когда я запускаю его с половиной строк, он работает, но R должен отправлять только имена каждой переменной (всего 50) обратно в Java независимо от того, сколько строк есть. Это код, который я использую:
re.eval("names(data<-read.csv(file="data.csv", head=TRUE, sep=","));
Насколько я понимаю, функция re.eval оценивает выражение в R и отправляет результаты обратно в R. Можно ли как-то оценить функцию и не вернуть результат в java?
Я задавал подобный вопрос раньше, вот ссылка: Оценка выражений, вызываемых из Java в R. Ошибка нехватки памяти: Java Heap
2 ответа
Вы пытались настроить размер кучи JVM, запустив исполняемый файл с параметрами?
Подобно:
java -Xmx1024m -Xms1024m myJar
Вы можете настроить значения памяти, очевидно, но опция -Xmx
устанавливает максимальный размер кучи для JVM и -Xms
устанавливает начальный размер.
Это может помочь, если вы обрабатываете много данных, которые вам действительно нужно получить, в противном случае варианты (в соответствии с предложением cdeszaq), когда вы не получаете никаких данных обратно, явно подойдут вам.
Один из способов сделать это, чтобы вы могли вызывать R, не возвращая ничего в Java, - это вызывать R как внешний процесс. Поскольку, похоже, это примерно то, что вы делаете в любом случае, возможно, если ОС выполнит вызов R, а не библиотеку внутри Java, предотвратит переполнение.