Итак, у меня есть файл данных (разделенный точкой с запятой), в котором много деталей и неполных строк (ведущий Access и SQL для подавления). Этот набор данных уровня графства разбит на сегменты, подсегменты и подсегменты (всего на 200 факторов) в течение 40 лет. Короче говоря, он огромный, и он не собирается вписываться в память, если я попытаюсь просто прочитать его.
Итак, мой вопрос заключается в том, что я хочу, чтобы все графства, но всего один год (и только самый высокий уровень сегмента..., что привело к примерно 100 000 строк в конце), что было бы лучшим способом переходите к тому, чтобы этот сверток в R?
В настоящее время я пытаюсь вырезать нерелевантные годы с Python, обойдя ограничение размера файлов, читая и работая по одной строке за раз, но я бы предпочел решение R-only (пакеты CRAN в порядке). Есть ли аналогичный способ чтения в файлах фрагмента за раз в R?
Будем очень благодарны за любые идеи.
Update:
- Ограничения
- Нужно использовать мою машину, поэтому никаких экземпляров 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, будет работать лучше всего. Я дал Мареку чек, потому что он дал примерную реализацию.
Я воспроизвел слегка адаптированную версию реализации Marek для моего окончательного ответа здесь, используя strsplit и cat, чтобы сохранить только столбцы, которые я хочу.
Также следует отметить, что это намного эффективнее, чем Python... как в Python chomps через файл 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
- Честно говоря, docs запугали меня в этом немного, поэтому я не стал его пытаться. Похоже, что объект также должен был быть в памяти, что бы победить точку, если бы это было так.
- bigmemory
- Этот подход полностью связан с данными, но он может обрабатывать только один тип за раз. В результате все мои векторы персонажей упали, когда помещены в большую таблицу. Если мне нужно создавать большие наборы данных для будущего, я бы рассмотрел только использование чисел, чтобы сохранить этот вариант в живых.
- сканирования
- У сканирования, похоже, были проблемы с подобным типом, такие как большая память, но со всеми механиками readLines. Короче говоря, это просто не соответствовало законопроекту на этот раз.