Ответ 1
Похоже, что целочисленный предел будет рассмотрен очень рано в R. По моему опыту, этот предел может блокировать наборы данных с менее чем 2 миллиардами ячеек (вокруг максимального целого), а функции низкого уровня, такие как sendMaster
в пакете multicore
полагаться на передачу необработанных векторов. У меня было около 1 миллиона процессов, представляющих около 400 миллионов строк данных и 800 миллионов ячеек в формате data.table, и когда mclapply отправлял результаты обратно, он столкнулся с этим пределом.
Стратегия разделить и побеждать не так уж трудна, и она работает. Я понимаю, что это взломать, и нужно быть в состоянии полагаться на mclapply.
Вместо одного большого списка создайте список списков. Каждый под-список меньше, чем сломанная версия, и затем вы передаете их в mclapply split by split. Назовите это file_map
. Результатом является список списков, поэтому вы можете использовать специальную функцию double concatenate do.call
. В результате каждый раз, когда mclapply заканчивается, размер сериализованного необработанного вектора имеет управляемый размер.
Просто обведите более мелкие куски:
collector = vector("list", length(file_map)) # more complex than normal for speed
for(index in 1:length(file_map)) {
reduced_set <- mclapply(file_map[[index]], function(x) {
on.exit(message(sprintf("Completed: %s", x)))
message(sprintf("Started: '%s'", x))
readBamGappedAlignments(x)
}, mc.cores=10)
collector[[index]]= reduced_set
}
output = do.call("c",do.call('c', collector)) # double concatenate of the list of lists
В качестве альтернативы сохраните вывод в базе данных по ходу, например SQLite.