Bu yüzden, çok fazla ayrıntıya ve eksik satırlara sahip bir veri dosyası (noktalı virgülle ayrılmış) var (Access ve SQL boğulacak). 40 yıl boyunca segmentlere, alt segmentlere ve alt segmentlere (toplam ~ 200 faktör için) ayrılmış ilçe düzeyinde veri seti. Kısacası, çok büyük ve basitçe okumaya çalışırsam hafızaya sığmayacak.
Öyleyse sorum şu, tüm ilçeleri, ancak yalnızca tek bir yıl (ve sadece en yüksek segment seviyesi ... sonunda yaklaşık 100.000 satıra yol açan) istediğim için, bunu elde etmenin en iyi yolu bu toplama R'ye mi?
Şu anda Python ile ilgisiz yılları kesmeye çalışıyorum, bir seferde bir satır okuyup çalıştırarak dosya boyutu sınırını aşmaya çalışıyorum, ancak yalnızca R'ye yönelik bir çözümü tercih ederim (CRAN paketleri TAMAM). R'de her seferinde bir parçayı dosyalarda okumanın benzer bir yolu var mı?
Herhangi bir fikir çok takdir edilecektir.
Güncelleme:
- Kısıtlamalar
- Makinemi kullanmam gerekiyor , bu nedenle EC2 bulut sunucusu yok
- Mümkün olduğunca yalnızca R olarak. Makinem patlamazsa, bu durumda hız ve kaynaklar sorun değildir ...
- Aşağıda görebileceğiniz gibi, veriler daha sonra üzerinde çalışmam gereken karma türleri içeriyor
- Veri
- Veriler, yaklaşık 8,5 milyon satır ve 17 sütunla 3,5 GB'tır
- Birkaç bin satır (~ 2k) hatalı biçimlendirilmiş ve 17 yerine yalnızca bir sütun
- Bunlar tamamen önemsizdir ve düşebilir
- Bu dosyadan yalnızca ~ 100.000 satıra ihtiyacım var (Aşağıya bakın)
Veri örneği:
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]
Verilerin R'ye sığabilmesi için bazı sütunları ayırmak ve mevcut 40 yıldan ikisini (1980-2020 arası 2009-2010) seçmek 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:
Yapılan tüm önerileri düzelttikten sonra, JD ve Marek'in önerdiği readLines'ın en iyi sonucu vereceğine karar verdim. Marek'e bir örnek uygulama verdiği için çeki verdim.
Burada son cevabım için Marek uygulamasının biraz uyarlanmış bir versiyonunu yeniden ürettim, strsplit ve cat kullanarak sadece istediğim sütunları tutuyorum.
Bunun Python'dan ÇOK daha az verimli olduğu da unutulmamalıdır ... Python 3.5GB dosyayı 5 dakika içinde bitirirken, R yaklaşık 60 dakika sürer ... ama sahip olduğunuz tek şey R ise, o zaman bu bilettir.
## 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şıma Göre Başarısızlıklar:
- sqldf
- Veriler iyi biçimlendirilmişse, gelecekte bu tür problemler için kesinlikle kullanacağım şey budur. Ancak, değilse, SQLite tıkanır.
- Harita indirgeme
- Dürüst olmak gerekirse, doktorlar bu konuda beni biraz korkuttu, bu yüzden denemeye başlamadım. Nesnenin de hafızada olmasını gerektiriyor gibi görünüyordu, bu durum böyle olsaydı bu noktayı yenebilirdi.
- büyük hafıza
- Bu yaklaşım verilere net bir şekilde bağlanmıştır, ancak aynı anda yalnızca bir türü işleyebilir. Sonuç olarak, büyük bir masaya konulduğunda tüm karakter vektörlerim düştü. Gelecek için büyük veri kümeleri tasarlamam gerekirse, yalnızca bu seçeneği canlı tutmak için sayıları kullanmayı düşünürdüm.
- taramak
- Tarama, büyük bellekle benzer tür sorunlara sahip gibi görünüyordu, ancak readLines'in tüm mekanikleriyle. Kısacası, bu sefer faturaya uymadı.
sed
ve / veyaawk
oluşturmaktan büyük olasılıkla kurtulabilirsiniz . Bu bir cevaptan çok bir geçici çözüm olduğu için, bunu bir yorum olarak bırakacağım.