Ответ 1
Прежде всего, если ваша проблема с оперативной памятью, как вы сказали, каждый файл имеет 22G, использование сжатых файлов не решит ваши проблемы. Например, после read.table весь файл будет загружен в память. Если вы используете эти файлы для какого-либо моделирования, советую взглянуть на пакеты ff и bigmemory.
Другое решение - использовать Revolutions R, которая имеет академическую лицензию, и вы можете использовать ее бесплатно. Revolutions R предоставляет возможности больших данных, и вы можете легко управлять этими файлами с помощью таких пакетов, как revoscaleR.
Еще одно решение - использование Postgres + MADLib + PivotalR. После загрузки данных в Postgres используйте пакет PivotalR для доступа к этим данным и создания моделей с библиотекой MADLib непосредственно из консоли R.
НО, если вы планируете что-то сделать с кусками данных, например, для суммирования, вы можете использовать итераторы пакетов. Я приведу пример использования, чтобы показать, как это можно сделать. Получите данные авиакомпании 1988 года и следуйте этому коду:
> install.packages('iterators')
> library(iterators)
> con <- bzfile('1988.csv.bz2', 'r')
Хорошо, теперь у вас есть соединение с вашим файлом. Давайте создадим итератор:
> it <- ireadLines(con, n=1) ## read just one line from the connection (n=1)
Просто чтобы проверить:
> nextElem(it)
и вы увидите что-то вроде:
1 "1988,1,9,6,1348,1331,1458,1435, PI, 942, NA, 70,64, NA, 23,17, SYR, BWI, 273, NA, NA, 0, NA, 0, Н. А., Н. А., Н. А., Н. А., Н. А."
> nextElem(it)
и вы увидите следующую строку и так далее. Имейте в виду, что вы читаете строку за раз, поэтому вы не загружаете весь файл в оперативную память.
Если вы хотите читать построчно до конца файла, вы можете использовать
> tryCatch(expr=nextElem(it), error=function(e) return(FALSE))
например. Когда файл заканчивается, он возвращает логическое значение ЛОЖЬ.