2011-12-29 39 views
7

Biraz bölme yaptığım ve özetlediğim oldukça büyük bir veri kümem var (~ 1.4m satır). Her şey çalıştırmak için bir süre alır ve benim son uygulama sık çalışan bağlıdır, yani benim düşünce doMC kullanmak ve böylece gibi plyr ile .parallel=TRUE bayrağı (biraz basitleştirilmiş):Çok büyük veri kümesi ile plyr, doMC ve summarize() kullanma?

library(plyr) 
require(doMC) 
registerDoMC() 

df <- ddply(df, c("cat1", "cat2"), summarize, count=length(cat2), .parallel = TRUE) 

Ben ayarlarsanız 8 GB'lık RAM'im (registerDoMC(cores=2)'u kullanarak) iki tane açıkça (2 registerDoMC(cores=2) kullanarak) beni görüyorum ve iyi bir zaman harcıyor. Ancak, tüm 8 çekirdeği kullanmasına izin verirsem, çatallı süreçlerin her birinin bellekte tüm veri kümesini klonladığı gerçeği nedeniyle hızlı bir şekilde bellek biter.

Sorum şu: plyr'in paralel yürütme olanaklarını daha fazla bellek tutumuyla kullanmanın mümkün olup olmadığı nedir? Bir big.matrix benim dataframe dönüştürme çalıştım ama bu sadece tek bir çekirdek kullanmaya geri şeyi zorlamak gibiydi: Bu çok çekirdekli R bilişime benim ilk baskını

library(plyr) 
library(doMC) 
registerDoMC() 
library(bigmemory) 

bm <- as.big.matrix(df) 
df <- mdply(bm, c("cat1", "cat2"), summarize, count=length(cat2), .parallel = TRUE) 

olduğunu

, bu nedenle daha iyi bir yolu olup olmadığını Bunu düşünerek öneriye açığım.

GÜNCELLEME: Hayatta birçok şeyde olduğu gibi, bu benim kodunda başka yerde Diğer Aptal şeyler yapıyordu çıkıyor ve çok işlemenin bütün mesele bu özel durumda tartışmalı bir noktaya olur. Ancak, büyük veri katlama görevleri için, data.table'u aklımda tutacağım. Katlama görevimi basit bir şekilde kopyalayabildim.

+3

Bu tür şeylerde genellikle çok daha hızlı olan ** data.table ** paketini ifade eden zorunlu yorumunuzu bırakacağım. – joran

+0

Hey, onu bana dövdün! –

+2

Gerçekten 8 çekirdiniz var mı? Ya da 4 çekirdekli ve 4 "hiper-iş parçacığı" çekirdekli Intel? MPICH (R değil) altında çalışan ve% 50 CPU'da 4'e kadar ölçek uygulayan bir uygulama var, ancak% 100 CPU veren 8 çekirdekten sonra çok daha yavaş çalışıyor. –

cevap

6

Bu plyr'in tüm veri kümesinin kopyalarını oluşturduğunu düşünmüyorum. Bununla birlikte, bir veri kümesini işlerken, bu alt kümeye işçiye kopyalanır. Bu nedenle, daha fazla işçi kullanıldığında, aynı anda daha fazla alt-bellek hafızaya alınır (yani 2 yerine 8).

Sana deneyebilirsiniz birkaç ipucu düşünebilirsiniz:

  • bir data.frame yerine yayın dizi yapısına verilerinizi koyun ve özetleme yapmak adply kullanın. Diziler bellek kullanımı ve hız açısından çok daha verimlidir. Normal matrisler kullanmak istiyorum, big.matrix'i değil. Bazı durumlarda, bu durum birkaç büyüklükteki sipariş hızının artmasına yol açabilir.
  • data.table verin. Data.table'ın paralel işlemeyi destekleyip desteklemediğinden emin değilim, ancak paralel olarak bile, data.table daha hızlı zamanların kalabalığı olabilir. Veri parçalarını işlemek için blog post of mine'u ave, ddply ve data.table ile karşılaştırarak inceleyin.
+1

Bu blog gönderisini kontrol etmek isteyebilirsiniz.Karşılaştırmakta olduğunuz üç işlev farklı görevler yapıyor gibi görünüyor: sadece bir tanesi anlatabildiğim kadar bir ortalama hesaplıyor. –

+0

Teşekkürler, ona bir bakacağım! Postanın sonucunu değiştirmediğinden şüpheleniyorum, yani data.table çok muhc daha hızlıdır. –

İlgili konular