SORU
13 Kasım 2009, Cuma


Hızlı okuma çok büyük bir tablo R dataframes olarak

Ben çok büyük bir tablo (30 milyon satır) isterim yük olarak bir dataframes R. read.table() Bir çok kullanışlı özellikleri, ama göründüğü gibi bir sürü mantık uygulaması bu işleri yavaşlatır. Benim durumumda, ben varsayarak biliyorum türleri sütunlarının önünde zaman, tablo içermeyen herhangi bir sütun başlıkları ve satır adları ve henüz herhangi bir patolojik karakter var endişe etmene gerek yok.

Listesi scan() kullanarak bir tablo okuma oldukça hızlı, örneğin olabilir biliyorum:

datalist <- scan('myfile',sep='\t',list(url='',popularity=0,mintime=0,maxtime=0)))

Ama bir dataframe için bu dönüştürmek için benim girişimleri bazı 6 kat yukarıda performansının düşmesine görünür:

df <- as.data.frame(scan('myfile',sep='\t',list(url='',popularity=0,mintime=0,maxtime=0))))

Bunu yapmanın daha iyi bir yolu var mı? Ya da belki sorun tamamen farklı bir yaklaşım oldukça?

CEVAP
30 Kasım 2009, PAZARTESİ


Bu soru başlangıçta göremedim ve bir kaç gün sonra benzer bir soru sordu. Önceki soruma aşağı çekmek için gidiyorum, ama sqldf() yapardık bunu nasıl açıklamak için burada bir cevap eklemek istedim.

R veri bir çerçeve içine 2 GB almak için en iyi yolu veya metin veri ve daha fazlası gibi little bit of discussion oldu. Dün bir blog post toplanma bölgesi olarak SQLite içine sqldf() veri almak için kullanma hakkında yazdım ve sonra da R. içine SQLite emme Bu benim için gerçekten çok iyi çalışıyor. 2 GB (3 sütun, 40mm satır) < veri çekme şansım oldu; 5 dakika. Buna karşılık, read.csv komutu bütün gece koştu ve asla tamamlanmamış.

İşte benim test kodu:

Test verileri:

bigdf <- data.frame(dim=sample(letters, replace=T, 4e7), fact1=rnorm(4e7), fact2=rnorm(4e7, 20, 50))
write.csv(bigdf, 'bigdf.csv', quote = F)

Aşağıdaki alma yordamı çalıştırmadan önce R I yeniden:

library(sqldf)
f <- file("bigdf.csv")
system.time(bigdf <- sqldf("select * from f", dbname = tempfile(), file.format = list(header = T, row.names = F)))

Aşağıdaki satırı bütün gece bırakıyorum ama asla tamamlanmamış:

system.time(big.df <- read.csv('bigdf.csv'))

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • TheOtherMau5

    TheOtherMau5

    6 Mart 2012
  • Truc Minh

    Truc Minh

    23 Ocak 2011
  • xiaoyu85

    xiaoyu85

    20 ŞUBAT 2010