Сценарий R исчерпывает память — кластер Microsoft HPC

У меня есть сценарий R со следующим исходным кодом:

genofile<-read.table("D_G.txt", header=T, sep=',')
genofile<-genofile[genofile$"GC_SCORE">0.15,]
cat(unique(as.vector(genofile[,2])), file="GF_uniqueIDs.txt", sep='\n')

D_G.txt — это огромный файл, около 5 ГБ.

Теперь вычисления выполняются в кластере Microsoft HPC, поэтому, как вы знаете, когда я отправляю задание, оно «распределяется» по разным физическим узлам; в моем случае каждый имеет 4 ГБ оперативной памяти.

Что ж, через разное количество времени я получаю печально известное сообщение об ошибке cannot allocate vector of size xxx Mb. Я пытался использовать переключатель, который ограничивает полезную память:

--max-memory=1GB

но ничего не меняется.

Я пробовал Rscript 2.15.0 как 32-битную, так и 64-битную, но безуспешно.


person Delta    schedule 17.04.2012    source источник
comment
Похоже, что для такой работы кластер не нужен. В этом случае вы можете читать файл и фильтровать его построчно. Но если вам нужно ускорить обработку, вам, возможно, потребуется разделить файл на отдельные куски и обработать их на разных узлах, как советует Пол. И, конечно же, добавьте, пожалуйста, немного кода, как вы запускаете кластер в R и отправляете задания на узлы. Я думаю, это будет полезно.   -  person DrDom    schedule 17.04.2012
comment
Спасибо @DrDom, я наконец-то разделил файл (проверьте мой комментарий под ответом Пола)   -  person Delta    schedule 17.04.2012


Ответы (1)


То, что ваш набор данных как таковой должен умещаться в памяти одной ноды, не означает, что при выполнении анализа на нем также означает, что он умещается в памяти. Часто анализы вызывают копирование данных. Кроме того, некоторые неэффективные программы с вашей стороны также могут увеличить использование памяти. Установка переключателя и ограничение использования памяти R только усугубляет ситуацию. Он не ограничивает фактическое использование памяти, а ограничивает максимальное использование памяти. И использование 32-разрядной ОС всегда требует немного памяти, поскольку максимальный объем памяти, который может быть адресован одним процессом с использованием 32-разрядной ОС, составляет менее 4 ГБ.

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

person Paul Hiemstra    schedule 17.04.2012
comment
Вот что у меня получилось: - Я модифицировал скрипт, чтобы входные/выходные файлы можно было указывать в командной строке. - Входной файл разделен на 10 фрагментов по ~ 500 МБ каждый. - Определена задача очистки в Microsoft HPC Job Manager, которая запускает отдельный экземпляр R для каждого входного файла на разных физических узлах. Теперь все работает отлично. Большое спасибо! - person Delta; 17.04.2012