Невозможно выделить вектор в R с большим количеством доступной памяти

Я пытаюсь загрузить большой CSV файл (226M строк по 38 столбцов) на R 64-бит с помощью пакета data.table. Размер файла на диске составляет около 27 ГБ. Я делаю это на сервере с 64 ГБ ОЗУ. Я закрыл все остальное и начал новую сессию R/Rstudio, поэтому, когда я запускаю fread, используется только 2 ГБ памяти. Как процессы чтения, я вижу, что использование памяти увеличивается примерно до 45,6 Гб, а затем я получаю страшный Error: cannot allocate vector of size 1.7 Gb. Тем не менее, осталось более 18 ГБ. Возможно ли, что в 18 ГБ ОЗУ нет ни одного непрерывного блока 1.7Gb? Это связано с фиксированным размером (что я допускаю, чтобы не понимать), и если да, то есть ли способ минимизировать зафиксированный размер, чтобы достаточно места остается

Список содержит историю когорты пользователей, для которой я хочу скомпилировать и суммировать определенные статистические данные с течением времени. Я смог импортировать подмножество из 38 столбцов, используя select в fread, поэтому я не полностью потеряю, но это значит, что мне нужно работать с другими переменными, мне нужно выбрать и выбрать, и может в конечном итоге запустить ту же ошибку.

Для установки, которая у меня есть, есть ли другие способы получить весь этот набор данных в памяти, или мне нужно либо продолжать импортировать подмножества, либо перейти на платформу, совместимую с большими данными?

Спасибо.

Использование памяти до чтения

Использование памяти перед чтением

Использование памяти при сбое

Использование памяти при сбое

Информация о сеансе

R version 3.3.0 Patched (2016-05-11 r70599)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows Server >= 2012 x64 (build 9200)

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] data.table_1.9.6

loaded via a namespace (and not attached):
[1] tools_3.3.0  chron_2.3-47

Ответ 1

У вас закончилась нехватка памяти, потому что некоторые типы данных могут использовать меньше памяти как обычный текст, чем в памяти (также может быть и наоборот). Классическим примером этого является, например, однозначные целые числа (0-9), которые будут занимать только один байт в текстовом файле, но будут использовать 4 байта памяти в R (и, наоборот, больше четырехзначных чисел будут занимать меньше памяти, чем соответствующие текстовые символы).

Обходной путь для этого состоит в том, чтобы читать эти столбцы как character вместо этого, что будет сохранять следы памяти одинаковыми и только преобразовывать их в целые числа при выполнении числовых операций над ними. Естественно, компромисс будет быстрым.