Отже, у мене є файл даних (з крапкою з комою), який містить багато деталей і неповних рядків (що приводить Access і SQL до задухи). Це набір даних рівня округу, розбитий на сегменти, підсегменти та підсегменти (загалом ~ 200 факторів) протягом 40 років. Коротше кажучи, він величезний, і він не впишеться в пам’ять, якщо я спробую його просто прочитати.
Отже, моє запитання полягає в тому, що, враховуючи те, що я хочу всі округи, але лише один рік (і лише найвищий рівень сегменту ... що в кінцевому підсумку призведе до приблизно 100 000 рядків), який би був найкращий спосіб отримати це зведення в R?
В даний час я намагаюся вирізати нерелевантні роки за допомогою Python, обходячи обмеження розміру файлів, читаючи та працюючи по одному рядку за раз, але я б віддав перевагу рішенням лише для R (пакети CRAN OK). Чи існує подібний спосіб читати у файлах фрагменти за раз у R?
Будь-які ідеї будуть дуже вдячні.
Оновлення:
- Обмеження
- Потрібно використовувати мою машину, тому жодних екземплярів EC2
- Як тільки R, наскільки це можливо. Швидкість і ресурси в цьому випадку не турбуються ... за умови, що моя машина не вибухне ...
- Як ви можете бачити нижче, дані містять змішані типи, які мені потрібно оперувати пізніше
- Дані
- Дані складають 3,5 ГБ, приблизно 8,5 мільйонів рядків і 17 стовпців
- Кілька тисяч рядків (~ 2k) мають неправильний вигляд, лише один стовпець замість 17
- Вони абсолютно не важливі і можуть бути скасовані
- Мені потрібно лише ~ 100 000 рядків з цього файлу (див. Нижче)
Приклад даних:
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]
Я хочу вирізати кілька стовпців і вибрати два із 40 доступних років (2009-2010 з 1980-2020), щоб дані могли вписуватися в 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]
Результати:
Поміркувавши з усіма запропонованими пропозиціями, я вирішив, що readLines, запропоновані JD та Marek, будуть працювати найкраще. Я дав Мареку чек, тому що він дав зразок реалізації.
Для остаточної відповіді я відтворив трохи адаптовану версію реалізації Марека, використовуючи strsplit та cat, щоб зберігати лише ті стовпці, які я хочу.
Слід також зазначити, що це НАБАГАТО менш ефективно, ніж Python ... як, наприклад, Python перебирає файл розміром 3,5 ГБ за 5 хвилин, тоді як R займає близько 60 ... але якщо у вас все є R, то це квиток.
## 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)
Невдачі за підходом:
- sqldf
- Це безумовно те, що я буду використовувати для такого типу проблем у майбутньому, якщо дані будуть сформовані належним чином. Однак якщо це не так, тоді SQLite задихається.
- MapReduce
- Чесно кажучи, документи трохи мене залякали, тому я не зміг спробувати. Здавалося, це вимагало, щоб об'єкт також знаходився в пам'яті, що перемогло б справу, якби це було так.
- bigmemory
- Цей підхід чітко пов'язаний з даними, але одночасно може обробляти лише один тип. В результаті всі мої вектори персонажів падали, коли їх розміщували у великій таблиці. Якщо мені потрібно розробити великі набори даних на майбутнє, я б розглянув використання цифр лише для того, щоб зберегти цю опцію.
- сканування
- Здавалося, сканування має подібні проблеми із типом великої пам’яті, але з усіма механіками readLines. Коротше кажучи, цього разу це просто не відповідало законопроекту.
sed
та / абоawk
створюючи скорочену версію CSV, яку ви можете прочитати безпосередньо. Оскільки це більше обхідний шлях, ніж відповідь, я залишу це як коментар.