Я использую вложенный foreach из пакета doSMP для генерации результатов на основе разработанной мной функции. Обычно проблема связана с тремя вложенными циклами, но из-за размера генерируемых результатов (около 80 000 для каждого i) мне пришлось приостановить компиляцию и записать результаты в файл, когда окончательная матрица результатов превышает указанное количество строк.
i = 1
write.off = 1
while(i <= length(i.vector)){
results.frame = as.data.frame(matrix(NA, ncol = 3, nrow = 1))
while(nrow(results.frame) < 500000 & i <= length(i.vector)){
results = foreach(j = 1:length(j.vector), .combine = "rbind", .inorder = TRUE) %:%
foreach(k = 1:length(k.vector), .combine = "rbind", .inorder = TRUE) %dopar%{
ith.value = i.vector[i]
jth.value = j.vector[j]
kth.value = k.vector[k]
my.function(ith.value, jth.value, kth.value)
}
results.frame = rbind(results.frame, results)
i = i + 1
}
results.frame = results.frame[-1,]
write.table(results.frame, paste("part_",write.off, sep = ""))
write.off = write.off + 1
}
Проблема, с которой я столкнулся Винг - это сборка мусора. Рабочие, похоже, не перераспределяют память обратно в систему, поэтому к i = 4 каждый из них съел около 6 ГБ памяти.
Я пробовал вставлять gc () непосредственно в цикл foreach, а также в базовую функцию, а также пытался назначить функцию и ее результаты именованной среде, которую я могу периодически очищать. Ни один из этих методов не помог.
Мне кажется, что параметры initEnvir и finalEnvir в foreach могут предложить решение, но документация и примеры не проливают на это много света.
Я запускаю этот код на виртуальной машине под управлением Windows Server 2008.