Я знаю, что это очень старая тема.Однако я недавно столкнулся с этим, потому что у меня была похожая проблема.После просмотра этой темы я заметил, что заметное решение этой проблемы не упоминалось.Используйте соединения!
1) Откройте соединение с вашим файлом
con = file("file.csv", "r")
2) Считайте куски кода с помощью read.csv
read.csv(con, nrows="CHUNK SIZE",...)
Примечание: определениеcolClasses значительно ускорит процесс.Обязательно укажите нежелательные столбцы как NULL.
3) Сделайте то, что вам нужно сделать
4) Повторите.
5) Закройте соединение
close(con)
Преимущество этого подхода - соединения.Если вы пропустите этот шаг, он, скорее всего, немного замедлит работу.Открывая соединение вручную, вы по существу открываете набор данных и не закрываете его, пока не вызовете функцию закрытия.Это означает, что, перебирая набор данных, вы никогда не потеряете свое место.Представьте, что у вас есть набор данных с 1e7 строк.Также представьте, что вы хотите загружать порцию из 1-5 строк одновременно.Поскольку мы открываем соединение, мы получаем первые 1e5 строк, выполняя read.csv(con, nrow=1e5,...)
, затем, чтобы получить второй блок, мы также запускаем read.csv(con, nrow=1e5,...)
и т. Д.
Если мы не использовалисоединения мы получили бы первый блок таким же образом, read.csv("file.csv", nrow=1e5,...)
, однако для следующего блока нам понадобится read.csv("file.csv", skip = 1e5, nrow=2e5,...)
.Очевидно, что это неэффективно.Мы должны снова найти строку 1e5 + 1, несмотря на то, что мы только что прочитали строку 1e5.
Наконец, data.table::fread
- это здорово.Но вы не можете передать это соединения.Так что этот подход не работает.
Надеюсь, это кому-нибудь поможет.
ОБНОВЛЕНИЕ
Люди продолжают голосовать за этот пост, поэтому я решил добавить одинболее краткая мысль.Новые readr::read_csv
, как и read.csv
, могут передаваться соединениям.Тем не менее, объявляется примерно в 10 раз быстрее.