#r #parallel-processing #write.table
#r #параллельная обработка #write.table
Вопрос:
У меня есть очень большие матрицы геномных данных (количество нуклеотидов в десятках людей для миллионов сайтов), которые мы обрабатываем с помощью R-скрипта, а затем записываем в файл с помощью ‘write.table’. Поскольку наши матрицы стали больше (больше людей, больше сайтов), мне пришлось изменить приведенный ниже код write.table, чтобы перебирать каждую строку матрицы и добавлять запись в файл, поскольку выполнение этого как одной команды приведет к сбою скрипта (насколько я помню, это была памятьошибка, но не цитируйте меня по этому поводу). Это медленнее, но не приводит к сбою! По какой-то причине, когда R записывает в file, он использует все доступные потоки, что само по себе хорошо, но на этом сервере есть несколько пользователей, и мне нужно иметь возможность ограничить количество процессоров, используемых в течение такого длительного времени, чтобы записать такую большуюфайлы. Я, вероятно, в конечном итоге переключусь на fwrite, но только для моего назидания, может ли кто-нибудь дать мне представление о том, почему он это делает и как я мог бы это ограничить?
print("R ALERT: Writing output files")
# write.table(Freqz, file=outname1,row.names=FALSE, col.names=TRUE, quote=FALSE)
write.table(Freqz[1,], file=outname1,row.names=FALSE, col.names=TRUE, quote=FALSE)
for(r in 2:nrow(Freqz)){
write.table(Freqz[r,], file=outname1,row.names=FALSE, col.names=FALSE, quote=FALSE,append=TRUE)
}
Комментарии:
1. Я действительно удивлен, что
write.table()
для записи на диск используется параллелизм.2. Да, я не думаю, что здесь происходит какая-либо параллельная обработка. R в общем случае является однопоточным, за исключением, как правило, довольно хорошо известных. Однако я вижу заполнение ОЗУ или блокировку жесткого диска. Раньше у меня запускалась проверка на вирусы, и я съедал весь свой процессор при записи больших файлов. Интересно, происходит ли здесь что-то еще.
3. Я наблюдаю за этим с помощью top и htop, и скрипт запускается во всех потоках после вызова как
Rscript $BASEDIR/rscripts/r_frequency.R $rin $rout $rout2 $MAF $INDCONT