Tôi có một tập dữ liệu khá lớn (~ 1.4m hàng) mà tôi đang làm một số tách và tóm tắt. Toàn bộ điều mất một thời gian để chạy, và ứng dụng cuối cùng của tôi phụ thuộc vào thường xuyên chạy, vì vậy suy nghĩ của tôi là sử dụng doMC
và .parallel=TRUE
cờ với plyr như vậy (giản một chút):Sử dụng plyr, doMC và tóm tắt() với tập dữ liệu rất lớn?
library(plyr)
require(doMC)
registerDoMC()
df <- ddply(df, c("cat1", "cat2"), summarize, count=length(cat2), .parallel = TRUE)
Nếu tôi đặt số lõi rõ ràng là hai (sử dụng registerDoMC(cores=2)
) 8 GB RAM của tôi nhìn thấy tôi thông qua, và nó cạo một khoảng thời gian khá. Tuy nhiên, nếu tôi để cho nó sử dụng tất cả 8 lõi, tôi nhanh chóng hết bộ nhớ do thực tế là mỗi quá trình được chia hai lần xuất hiện sao chép toàn bộ tập dữ liệu trong bộ nhớ.
Câu hỏi của tôi là liệu có thể sử dụng các cơ sở thực thi song song của plyr theo cách tiết kiệm bộ nhớ hơn không? Tôi đã cố gắng chuyển đổi dataframe của tôi đến một big.matrix
, nhưng điều này chỉ đơn giản là dường như để buộc toàn bộ điều trở lại sử dụng một lõi duy nhất:
library(plyr)
library(doMC)
registerDoMC()
library(bigmemory)
bm <- as.big.matrix(df)
df <- mdply(bm, c("cat1", "cat2"), summarize, count=length(cat2), .parallel = TRUE)
Đây là bước đột phá đầu tiên của tôi vào máy tính đa lõi R, vì vậy nếu có một cách tốt hơn suy nghĩ về điều này, tôi mở để gợi ý.
CẬP NHẬT: Như với nhiều thứ trong cuộc sống, hóa ra tôi đang làm những điều ngu ngốc khác ở đâu đó trong mã của tôi, và toàn bộ vấn đề xử lý đa điểm trở thành điểm tranh luận trong trường hợp cụ thể này. Tuy nhiên, đối với các tác vụ gấp dữ liệu lớn, tôi sẽ ghi nhớ data.table
. Tôi đã có thể tái tạo tác vụ gấp của mình một cách đơn giản.
Tôi đoán tôi sẽ để lại nhận xét bắt buộc giới thiệu bạn đến gói ** data.table **, thường nhanh hơn nhiều ở những thứ này. – joran
Hey, bạn đánh tôi với nó! –
Bạn có thực sự có 8 nhân? Hay đúng hơn là Intel với 4 lõi và 4 lõi "siêu phân luồng"? Tôi có một ứng dụng chạy dưới MPICH (không phải R) mà quy mô tốt cho đến 4 ở 50% CPU, nhưng chạy hiệu quả chậm hơn nhiều khi 8 lõi được yêu cầu cho 100% CPU. –