SORU
22 HAZİRAN 2010, Salı


(3.5 GB) büyük bir csv kırparak R okunur dosya

Detay ve eksik satır var bu veri dosyası () noktalı virgülle ayrılmış (Access ve SQL boğmak lider) var. İl düzeyinde veri kesimleri, alt kesimleri, kırık set ve-alt-alt kesimleri (~200 faktörler toplam) 40 yıldır. Kısacası, bu büyük bir olay ve eğer sadece okumak için çalışırsanız belleğe sığacak şekilde gitmiyor.

Yani benim soru bu, verilen tek istediğim iller, ama sadece tek bir yıl (ve sadece en yüksek düzeyde kesimi... önde gelen yaklaşık 100.000 satır sonunda ne olacağını en iyi yolu hakkında bu elde toplaması içine R?

Şu anda deniyorum chop alakasız yıl ile Python, etrafında başlarken dosya boyutu sınırı ile okuma ve işletim zamanda bir satır, ama tercih ederdim R-tek çözüm (BOZUK paketler TAMAM). Benzer bir şekilde dosyalarda R bir anda bir parça okumak var mı?

Herhangi bir fikir büyük mutluluk duyacağız.

Güncelleme:

  • Kısıtlamaları
    • Kullanması gerekirbenimmakine, bu yüzden hiçbir EC2 örnekleri
    • Mümkün olduğunca Ar-tek olarak. Hız ve kaynakları bu durumda... benim makine patlamamasının endişeleri sağlanır
    • Aşağıda gördüğünüz gibi, bu veriler üzerinde daha sonra ameliyat için lazım olan karışık türde, içerir
  • Veri
    • Veri 3.5 GB, yaklaşık 8,5 milyon satır ve sütunlar ile 17
    • Birkaç bin satır (~2k), 17 yerine tek bir sütun ile biçimlendirilmiş
      • Bu tamamen önemsiz ve vazgeçilebilir
    • Ben sadece bu dosyayı (aşağıya Bakınız) ~100,000 satır gerekir

Veri örnek:

County; State; Year; Quarter; Segment; Sub-Segment; Sub-Sub-Segment; GDP; ...
Ada County;NC;2009;4;FIRE;Financial;Banks;80.1; ...
Ada County;NC;2010;1;FIRE;Financial;Banks;82.5; ...
NC  [Malformed row]
[8.5 Mill rows]

Veri R içine sığabilecek böylece bazı sütunlar doğrayın ve 40 yıl kullanılabilir (1980-2020 gelen 2009-2010) iki almak istiyorum:

County; State; Year; Quarter; Segment; GDP; ...
Ada County;NC;2009;4;FIRE;80.1; ...
Ada County;NC;2010;1;FIRE;82.5; ...
[~200,000 rows]

Sonuçlar:

Tüm öneriler, yapılan müdahalesi sonrasında, readLines, JD ve Marek tarafından önerilen, en iyi çalışacak karar verdim. Örnek bir uygulama verdi çünkü Çek Marek verdim.

Son cevabım buraya Marek uygulanması biraz uyarlanmış bir sürümü, strsplit ve kedi istiyorum sadece sütunları tutmak için kullanarak ürettim.

Ayrıca bu olduğu unutulmamalıdırÇOKeğer bütün R ise R 60... alırken ama, 5 dakika içinde 3.5 GB dosya üzerinden Python chomp gibi Python... o zaman daha az verimli bu bilet.

## Open a connection separately to hold the cursor position
file.in <- file('bad_data.txt', 'rt')
file.out <- file('chopped_data.txt', 'wt')
line <- readLines(file.in, n=1)
line.split <- strsplit(line, ';')
# Stitching together only the columns we want
cat(line.split[[1]][1:5], line.split[[1]][8], sep = ';', file = file.out, fill = TRUE)
## Use a loop to read in the rest of the lines
line <- readLines(file.in, n=1)
while (length(line)) {
  line.split <- strsplit(line, ';')
  if (length(line.split[[1]]) > 1) {
    if (line.split[[1]][3] == '2009') {
        cat(line.split[[1]][1:5], line.split[[1]][8], sep = ';', file = file.out, fill = TRUE)
    }
  }
  line<- readLines(file.in, n=1)
}
close(file.in)
close(file.out)

Yaklaşımla başarısızlıkları:

  • sqldf
    • Eğer bu verileri biçimlendirilmiş ise gelecekte bu tür bir sorun için kullanacağım kesinlikle. Eğer değilse, ancak daha sonra bobinleri SQLite.
  • MapReduce
    • Dürüst olmak gerekirse, doktorlar bu biraz beni korkuttu, denemek için fırsatım olmadı bir türlü. Nesne eğer öyle olsaydı sürekli olurdu bellekte de olmak gerekli gibi görünüyordu.
  • bigmemory
    • Bu yaklaşım, temiz bir şekilde verilere bağlı, ama bir seferde sadece tek bir tür işleyebilir. Sonuç olarak, tüm karakter benim vektörler büyük içine koymak düştü.tablo. Eğer gelecek için büyük veri setleri tasarım olsa gerek, sadece sayılar sadece bu seçenek canlı tutmak için kullanmayı yeğlerim.
  • tarama
    • Tarama büyük bellek olarak benzer tür sorunları var, ama readLines tüm mekaniği ile görünüyordu. Kısacası, bill bu sefer uymadı.

CEVAP
24 HAZİRAN 2010, PERŞEMBE


readLines ile deneyin. Bir kod parçasını seçili yıllık csv oluşturur.

file_in <- file("in.csv","r")
file_out <- file("out.csv","a")
x <- readLines(file_in, n=1)
writeLines(x, file_out) # copy headers

B <- 300000 # depends how large is one pack
while(length(x)) {
    ind <- grep("^[^;]*;[^;]*; 20(09|10)", x)
    if (length(ind)) writeLines(x[ind], file_out)
    x <- readLines(file_in, n=B)
}
close(file_in)
close(file_out)

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 2ndfloor91

    2ndfloor91

    17 Kasım 2007
  • Alexey - servant of Christ

    Alexey - ser

    15 EYLÜL 2007
  • MuscleProdigyTV

    MuscleProdig

    8 Ocak 2011