Сначала вы можете найти все двусторонние комбинации, а затем просто объединить их со значением 3d, сохраняя их каждый раз. Это занимает намного меньше памяти:
combn.mod <- function(x,fname){
tmp <- combn(x,2,simplify=F)
n <- length(x)
for ( i in x[-c(n,n-1)]){
# Drop all combinations that contain value i
id <- which(!unlist(lapply(tmp,function(t) i %in% t)))
tmp <- tmp[id]
# add i to all other combinations and write to file
out <- do.call(rbind,lapply(tmp,c,i))
write(t(out),file=fname,ncolumns=3,append=T,sep=",")
}
}
combn.mod(x,"F:/Tmp/Test.txt")
Это не такой общий ответ, как ответ Иисуса Навина, это специально для вашего случая. Я предполагаю, что это быстрее - опять же, для этого конкретного случая - но я не делал сравнения. Функция работает на моем компьютере, используя чуть более 50 Мб (приблизительно) применительно к вашему x.
EDIT
На заметку: если это для целей моделирования, мне трудно поверить, что любое научное приложение требует 400+ миллионов прогонов моделирования. Вы можете задать правильный ответ на неправильный вопрос здесь ...
ДОКАЗАТЕЛЬСТВО КОНЦЕПЦИИ:
Я изменил строку записи на tt[[i]]<-out
, добавил tt <- list()
перед циклом и вернул (tt) после него. Тогда:
> do.call(rbind,combn.mod(letters[1:5]))
[,1] [,2] [,3]
[1,] "b" "c" "a"
[2,] "b" "d" "a"
[3,] "b" "e" "a"
[4,] "c" "d" "a"
[5,] "c" "e" "a"
[6,] "d" "e" "a"
[7,] "c" "d" "b"
[8,] "c" "e" "b"
[9,] "d" "e" "b"
[10,] "d" "e" "c"