2013-05-17 34 views
6

Veri çerçevesine yüklemek istediğim CSV veri satırlarını çıkaran bir programım var. Sadece programın yaklaşık 30MB tükürür (verimsiz okumak için bir dosyaya çıkış yönlendirme düşünce, AncakBir veri çerçevesine CSV çıkışı almanın en hızlı yolu nedir?

tmpFilename <- "tmp_file" 
system(paste(procName, ">", tmpFilename), wait=TRUE) 
myData <- read.csv(tmpFilename) # (I also pass in colClasses and nrows for efficiency) 

, bu yüzden optimum performans ile üstesinden istiyorum: Şu anda şöyle verilerin yüklenmesi). Ben textConnection bu çözmek düşündüm, bu yüzden denedim:

con <- textConnection(system(procName, intern=TRUE)) 
myData <- read.csv(con) 

Bu da, çok daha yavaş çalışır ve ilk çözüm giriş boyutu ile doğrusal olarak düşer oysa textConnection çözümün performansı katlanarak görünüyor bozulur. En yavaş kısım, textConnection'u oluşturuyor. read.csv burada aslında bellekten okuduğundan beri ilk çözümden daha hızlı tamamlıyor.

Soruma göre, sadece read.csv'u çalıştırmak için en iyi seçeneğim hıza göre bir dosya oluşturuyor mu? Bir textConnection oluşturulmasını hızlandırmak için bir yolu var mı? bonus: neden bir textConnection çok yavaş oluşturuluyor?

+0

Size 'stajyer = TRUE ile tüm çıkışını içeren ekstra vektörü oluştururken, anlaşılmaktadır. Bu vektör sürekli olarak bellek ayıracak olan çıktı üretilirken büyümeye devam edecektir. Bu satırı iki komuta böldüyseniz, 'output <- system (procname, intern = TRUE); con <- textConnection (output) ',' system' komutunun çoğu zaman çekeceğinden şüpheleniyorum. –

+0

sağ, böylelikle onu ayırırsam, en uzun ifade "textConnection (output)" çağrısıdır. "En uzun" ile, "sistem" bir kaç saniye sürdüğünü, "read.csv" başka bir kaç saniye sürdüğünü, "textConnection()" 4 dakika sürdüğünü kastediyorum. – Hudon

+1

Vay. Bu işletim sistemi nedir? Eğer Linux ise, RAM'den başka hiçbir şey kullanmayacak olan '/ dev/shm' altındaki dosyayı yaratacağım. –

cevap

3

"En hızlı yol" muhtemelen read.csv dışındaki bir şeyi kullanmayı içerir. Bununla birlikte, gitmek olabilir yolu boru kullanılarak, read.csv ile yapıştırma: (Read.csv ele geçirmeden en az önce)

myData <- read.csv(pipe(procName)) 

Bir ara tampon içine tam metin çıktısı okuma önler.

Bazı zamanlama karşılaştırmaları:

> write.csv(data.frame(x=rnorm(1e5)), row.names=FALSE, file="norm.csv") 
> system.time(d <- read.csv("norm.csv")) 
    user system elapsed 
    0.398 0.004 0.402 
> system.time(d <- read.csv(textConnection(system("cat norm.csv", intern=TRUE)))) 
    user system elapsed 
56.159 0.106 56.095 
> system.time(d <- read.csv(pipe("cat norm.csv"))) 
    user system elapsed 
    0.475 0.012 0.531 
+0

Sadece bunu denedim ve tam olarak aradığım şey tam olarak görünüyor (birkaç saniye traş). Pipo hakkında hiçbir fikrim yoktu. Teşekkür ederim! – Hudon

İlgili konular