2012-11-26 19 views
6

içinde paralel olarak yürütülür. R? Ile paralel olarak tek bir çok çekirdekli makinede tek bir metin dosyası üzerinde yineleme yapılabilir mi? Bağlam için metin dosyası 250-400MB JSON çıkışı arasında bir yerdedir.ReadLines, R

DÜZENLEME:

İşte ile oynamak bazı kod örnekleri vardır. Sürprizime paralel işlem başarısız oldu - sadece basit bir lapply - ama bu benim bölümümdeki kullanıcı hatası yüzünden olabilir. Ayrıca, bir dizi büyük dosyayı okumaya çalışırken, makinem tıkalı. İşte

## test on first 100 rows of 1 twitter file 
library(rjson) 
library(parallel) 
library(foreach) 
library(plyr) 
N = 100 
library(rbenchmark) 
mc.cores <- detectCores() 
benchmark(lapply(readLines(FILE, n=N, warn=FALSE), fromJSON), 
      llply(readLines(FILE, n=N, warn=FALSE), fromJSON), 
      mclapply(readLines(FILE, n=N, warn=FALSE), fromJSON), 
      mclapply(readLines(FILE, n=N, warn=FALSE), fromJSON, 
        mc.cores=mc.cores), 
      foreach(x=readLines(FILE, n=N, warn=FALSE)) %do% fromJSON(x), 
      replications=100) 

nedeniyle paralel olmayan dosya sistemi IO doğasına ikinci kod örneği

parseData <- function(x) { 
    x <- tryCatch(fromJSON(x), 
       error=function(e) return(list()) 
       ) 
    ## need to do a test to see if valid data, if so ,save out the files 
    if (!is.null(x$id_str)) { 
    x$created_at <- strptime(x$created_at,"%a %b %e %H:%M:%S %z %Y") 
    fname <- paste("rdata/", 
        format(x$created_at, "%m"), 
        format(x$created_at, "%d"), 
        format(x$created_at, "%Y"), 
        "_", 
        x$id_str, 
        sep="") 
    saveRDS(x, fname) 
    rm(x, fname) 
    gc(verbose=FALSE) 
    } 
} 

t3 <- system.time(lapply(readLines(FILES[1], n=-1, warn=FALSE), parseData)) 
+0

JSON dosyasını okumada veya JSON dosyasını ayrıştırmada sorun mu var? –

+0

Ne de. Basit bir döngü kullanmayı denediğimde makinem eninde sonunda donuyor. Her JSON girişine karşı bir işlev çalıştırmayı denedim, tekrar okumak için ayrı rds dosyalarını, vb. Kaydediyorum. Her seçenekle, bellek kullanımının da bilincindeyim ve mümkünse optimize etmeyi ve temizlemeye çalışıyorum. Bazı fikirler çok kötüydü, ama sonuçta, daha büyük veri setlerini sadece temel R ile analiz etmenin yollarını bulmak istiyorum, çünkü o an için daha iyi çözümlerin mevcut olduğu gerçeğini göz ardı ediyor. – Btibert3

+0

Tekrarlanabilir bir örnek, geri bildirim sağlamanızı çok daha kolay hale getirebilir. –

cevap

7

cevap ne bağlıdır Sorun aslında: Dosyayı paralel olarak okumak veya dosyayı paralel olarak işlemek. Paralel

yılında okuma

, ör birden fazla giriş dosyalar halinde JSON dosyasını bölmek ve paralel olarak bunları okuyabilir Paralel arka uç ile kombine plyr işlevleri kullanarak:

result = ldply(list.files(pattern = ".json"), readJSON, .parallel = TRUE) 

bir arka uç kaydedilmesi muhtemelen şimdi temel R. entegre edilmiştir parallel paketini kullanılarak yapılabilir Yoksa, doSNOW paketi kullanmak detaylar için this post on my blog görebilirsiniz.

İşleme en iyi bahis karakterlerin bir vektör içerisine tüm veri kümesi okumaktır Bu senaryoda

paralel

yılında, veri bölünmüş ve daha sonra örneğin kombine paralel panelini kullanabilirsiniz plyr işlevleri.

+1

Kötü bir fikir değil. Ve dosyayı kesmek için bir yol arıyorsanız, UNIX 'split' komutuna bir göz atın. –

+0

Linux komutları her zaman iyi bir çözümdür;) –

+0

@JeffAllen İlginç.Verileri önceden komutlarla önceden işlemeyi düşünmemiştim. Komut satırında uzman olmayan bir kişi değil, ama etrafta ne kadar çok konuştuğumu, birkaç komutun ne kadar güçlü olabileceğini görüyorum. – Btibert3

2

muhtemelen ile readLines() olduğunu. Tabii ki, paralel bir NFS veya HDFS gibi bir şey kullanıyorsanız, bu kısıtlama geçerli olmayacaktır. Ancak, "standart" bir mimaride olduğunuzu varsayarak, readLine() çağrılarınızı paralel hale getirmek mümkün olmayacaktır.

Yapabileceğiniz en iyi şey, muhtemelen muhtemelen daha sonra bellekte sığacak nesne zaten okunur girince işleme parallelize olacak < 500MB gibi görerek tüm dosyasında okumak olacaktır.

+0

+1, ancak biraz çalışma ile, her bir işçiye belirli bir dosya bağlantısından okuması gereken satır numaralarını atayarak muhtemelen 'readLines' ile paralellik kazanabilirsiniz. –

+0

@PaulHiemstra, bunun mümkün olan en basit durumda nasıl yapılabileceği hakkında bir örnek verebilir misiniz? :) –

+0

@AnthonyDamico Şu anda zamanım yok, ama bence önemsiz değil ve çok iyi çalışmayabilir. –