2015-02-24 39 views
5

Tôi đang cố gắng chạy song song predict() trên máy tính Windows của mình. Điều này làm việc trên tập dữ liệu nhỏ hơn, nhưng không quy mô tốt như cho mỗi quá trình sao chép mới của khung dữ liệu được tạo ra. Có cách nào để chạy song song mà không tạo bản sao tạm thời không?Dự đoán song song

My mã (chỉ có vài thay đổi của this mã gốc):

library(foreach) 
library(doSNOW) 

fit <- lm(Employed ~ ., data = longley) 
scale <- 100 
longley2 <- (longley[rep(seq(nrow(longley)), scale), ]) 

num_splits <-4 
cl <- makeCluster(num_splits) 
registerDoSNOW(cl) 

split_testing<-sort(rank(1:nrow(longley))%%num_splits) 

predictions<-foreach(i= unique(split_testing), 
        .combine = c, .packages=c("stats")) %dopar% { 
         predict(fit, newdata=longley2[split_testing == i, ]) 
        } 
stopCluster(cl) 

Tôi đang sử dụng sao chép dữ liệu đơn giản để kiểm tra nó. Với scale 10 hoặc 1000 nó đang hoạt động, nhưng tôi muốn làm cho nó chạy với scale <- 1000000 - khung dữ liệu với 16M hàng (khung dữ liệu 1.86GB như được chỉ ra bởi object_size() từ pryr. Lưu ý rằng khi cần thiết tôi cũng có thể sử dụng máy Linux, nếu điều này là lựa chọn duy

Trả lời

6

Bạn có thể sử dụng isplitRows chức năng từ gói itertools để chỉ gửi phần của longley2 đó là cần thiết cho nhiệm vụ:.

library(itertools) 

predictions <- 
    foreach(d=isplitRows(longley2, chunks=num_splits), 
      .combine=c, .packages=c("stats")) %dopar% { 
    predict(fit, newdata=d) 
    } 

Điều này ngăn cản toàn bộ khung longley2 dữ liệu bị tự động xuất khẩu cho từng công nhân và đơn giản hoá mã một chút.