2011-12-29 27 views
7

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.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.

+3

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

+0

Hey, bạn đánh tôi với nó! –

+2

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. –

Trả lời

6

Tôi không nghĩ rằng plyr tạo bản sao của toàn bộ tập dữ liệu. Tuy nhiên, khi xử lý một đoạn dữ liệu, tập hợp con đó sẽ được sao chép vào công nhân. Do đó, khi sử dụng nhiều công nhân hơn, nhiều tập con hơn trong bộ nhớ đồng thời (tức là 8 thay vì 2).

tôi có thể nghĩ ra một vài lời khuyên bạn có thể thử:

  • Đặt dữ liệu của bạn vào một cấu trúc mảng trong thay vì một data.frame và sử dụng adply để làm tổng kết. mảng hiệu quả hơn nhiều về mặt sử dụng và tốc độ bộ nhớ. Tôi có nghĩa là sử dụng ma trận bình thường, không phải big.matrix.
  • Hãy thử data.table một lần thử, trong một số trường hợp, điều này có thể dẫn đến tăng tốc độ nhiều đơn vị độ lớn. Tôi không chắc chắn nếu data.table hỗ trợ xử lý song song, nhưng ngay cả khi không song song, data.table có thể là hunderds của thời gian nhanh hơn. Xem số blog post of mine so sánh ave, ddplydata.table để xử lý khối dữ liệu.
+1

Bạn có thể muốn kiểm tra bài đăng trên blog đó.Ba chức năng bạn đang so sánh dường như đang thực hiện các nhiệm vụ khác nhau: chỉ một trong số chúng là tính toán mức trung bình theo như tôi có thể nói. –

+0

Cảm ơn, tôi sẽ cho nó một cái nhìn! Tôi nghi ngờ rằng nó không thay đổi kết quả của bài viết, cụ thể là data.table đó là muhc nhanh hơn nhiều. –

Các vấn đề liên quan