2013-02-18 4 views
0

это первый, который я использовал mclapply для запуска параллельного скрипта на нескольких процессах, но проблема, которую я пробовал сценарий на моем ноутбуке, и он работал очень хорошо и правильно набрал dataframe, но теперь, когда я запустить скрипт на моем office pc, когда печать заканчивается, и пришло время, чтобы собрать данные, скрипт останавливается с этой ошибкой:Ошибка выделения памяти при использовании mclapply

Error: cannot allocate vector of size 80 Kb 
fun <- function(testdf) { 
    l=12000 
    errordf=data.frame() 
    errordf <- mclapply(1:nrow(15000), function(i) 
    { 
    for (ind in 1:nrow(testdf)) 
     { 
     if(i >= l/2){ 
      testdf[ind,]$X = testdf[ind,]$pos * 2 
     } else 
     { 
      testdf[ind,]$X = testdf[ind,]$pos/l 
     } 
    } 

    permdf <- testdf 
    lapply(1:100, function(j) 
    { permdf$X<- sample(permdf$X,nrow(permdf), replace=FALSE) 
      fit=lm(X ~ gx, permdf) #linear regression calculation 
      regerror=sum(residuals(fit)^2) 

     data.frame(pc=i,error=regerror) 
    }) 

}, mc.cores=3) 
res<-NULL 
tmp <- lapply(errordf, function(ii){ 
    tmp <- lapply(ii, function(ij){ #rbind the data and return the dataframe 
     res<<- rbind(res, ij) 
    }) 
}) 
return (res) 
    } 

testdf Например:

structure(list(ax = c(-0.0242214, 0.19770304, 0.01587302, -0.0374415, 
0.05079826, 0.12209738), gx = c(-0.3913043, -0.0242214, -0.4259067, 
-0.725, -0.0374415, 0.01587302), pos = c(11222, 13564, 16532, 
12543, 12534, 14354)), .Names = c("ax", "gx", "pos"), row.names = c(NA, 
-6L), class = "data.frame") 

я уверен, что код работает (вот почему я не включил полный код), потому что я пробовал несколько раз на моем ноутбуке, но когда я попытался его на моем офисе ПК он обед этого ошибка.

любая помощь будет appreciatd

+0

Имеются ли версии пакетов на обоих ПК? Какие операционные системы вы используете? –

+0

В настоящее время у меня нет моего ноутбука, но это «macbook pro», и я думаю, что у меня есть все новые пакеты. и мой офисный компьютер - «fedora 16», а на офисном ПК у меня есть «R версия 2.15.2». – ifreak

+0

@ RomanLuštrik есть ли способ структурировать функции lapply лучше, чтобы избежать проблемы с памятью? возможно, замените 1 lapply на цикл или так? – ifreak

ответ

0

Прямо сейчас вы не используете применять по назначению в вас последний двойной вложенной lapply петли, вы можете также использовать for цикл вместо использования lapply в сочетании с глобальной переменной. Кроме того, вы постоянно растете res, это скорее память и время. Как правило, цикл lapply не пострадает от этой проблемы, но использование глобальной переменной полностью отрицает преимущество. Кажется, у вас есть двойной вложенный список, который вы хотите rbind. Я бы defintely не петлю над структурой данных, я бы просто использовал что-то по линиям do.call("rbind", data_structure), чтобы сделать это, хотя трудно дать конкретные рекомендации без воспроизводимого примера. Это решение не страдает от постоянно растущей проблемы, которую вы испытываете.

+0

не могли бы вы привести пример того, как мне обновить код? по крайней мере, как не впасть в вложенную непринужденную вещь ..? – ifreak

+0

Если вы предоставите воспроизводимый пример, я могу предоставить некоторый код. –

+0

Привет, я обновил код и добавил часть DataFrame, надеюсь, что это полезно ... – ifreak

Смежные вопросы