Jadi saya punya file data (dipisahkan titik koma) yang memiliki banyak detail dan baris yang tidak lengkap (menyebabkan Access dan SQL tersedak). Kumpulan data tingkat kabupaten dipecah menjadi segmen, sub-segmen, dan sub-sub-segmen (dengan total ~ 200 faktor) selama 40 tahun. Singkatnya, ini sangat besar, dan tidak akan masuk ke dalam memori jika saya mencoba untuk membacanya.
Jadi pertanyaan saya adalah ini, mengingat saya ingin semua wilayah, tetapi hanya satu tahun (dan hanya tingkat segmen tertinggi ... yang pada akhirnya mengarah ke sekitar 100.000 baris), apa cara terbaik untuk mendapatkan rollup ini menjadi R?
Saat ini saya mencoba untuk memotong tahun-tahun yang tidak relevan dengan Python, mengatasi batas ukuran file dengan membaca dan beroperasi pada satu baris pada satu waktu, tetapi saya lebih suka solusi R-only (paket CRAN OK). Apakah ada cara yang mirip untuk membaca dalam file sepotong demi sepotong di R?
Ide apa pun akan sangat dihargai.
Memperbarui:
- Kendala
- Perlu menggunakan mesin saya , jadi tidak ada instans EC2
- Sebagai R-only mungkin. Kecepatan dan sumber daya tidak menjadi perhatian dalam kasus ini ... asalkan mesin saya tidak meledak ...
- Seperti yang Anda lihat di bawah, datanya berisi jenis campuran, yang perlu saya operasikan nanti
- Data
- Datanya 3,5GB, dengan sekitar 8,5 juta baris dan 17 kolom
- Beberapa ribu baris (~ 2k) salah format, dengan hanya satu kolom, bukan 17
- Ini sama sekali tidak penting dan dapat dibatalkan
- Saya hanya membutuhkan ~ 100.000 baris dari file ini (Lihat di bawah)
Contoh data:
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]
Saya ingin memotong beberapa kolom dan memilih dua dari 40 tahun yang tersedia (2009-2010 dari 1980-2020), sehingga datanya dapat masuk ke dalam R:
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]
Hasil:
Setelah mengutak-atik semua saran yang dibuat, saya memutuskan bahwa readLines, yang disarankan oleh JD dan Marek, akan bekerja paling baik. Saya memberi Marek cek karena dia memberi contoh implementasi.
Saya telah mereproduksi versi implementasi Marek yang sedikit diadaptasi untuk jawaban akhir saya di sini, menggunakan strsplit dan cat untuk hanya menyimpan kolom yang saya inginkan.
Perlu juga dicatat bahwa ini JAUH kurang efisien daripada Python ... seperti dalam, Python mengolah file 3.5GB dalam 5 menit sementara R membutuhkan waktu sekitar 60 ... tetapi jika yang Anda miliki hanyalah R maka ini tiketnya.
## 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)
Kegagalan dengan Pendekatan:
- sqldf
- Ini pasti yang akan saya gunakan untuk jenis masalah ini di masa mendatang jika datanya terbentuk dengan baik. Namun, jika tidak, maka SQLite akan tersedak.
- MapReduce
- Sejujurnya, para dokter sedikit mengintimidasi saya tentang hal ini, jadi saya tidak sempat mencobanya. Sepertinya itu membutuhkan objek untuk berada dalam ingatan juga, yang akan mengalahkan poin jika memang begitu.
- memori besar
- Pendekatan ini ditautkan dengan rapi ke data, tetapi hanya dapat menangani satu jenis dalam satu waktu. Akibatnya, semua vektor karakter saya turun ketika dimasukkan ke dalam tabel besar. Jika saya perlu merancang kumpulan data yang besar untuk masa depan, saya akan mempertimbangkan hanya menggunakan angka saja untuk menjaga opsi ini tetap hidup.
- memindai
- Pemindaian tampaknya memiliki masalah jenis yang serupa dengan memori besar, tetapi dengan semua mekanisme readLines. Singkatnya, kali ini tidak sesuai dengan tagihan.
seddan / atauawkmembuat versi CSV cincang yang dapat Anda baca secara langsung. Karena ini lebih merupakan solusi daripada jawaban, saya akan meninggalkannya sebagai komentar.