R размер объекта списка больше, чем соответствующий файл необработанных данных - PullRequest
0 голосов
/ 14 октября 2018

У меня есть CSV-файл, который я импортирую в R, а затем разделю на несколько подмножеств, составляющих мой список «importData»:

filePath <- "Test.csv"
rowsPerBatch <- 58

numRows <- length(count.fields(file = filePath, sep = ","))
readSegment <- function(x) fread(file = filePath, sep = ",", header = TRUE, skip = rowsPerBatch*(x-1), nrows = rowsPerBatch-1)
importedData <- lapply(1:(numRows/rowsPerBatch), readSegment)

Необработанный CSV-файл занимает всего 4 МБ.Тем не менее, объект списка в R имеет размер 17,8 МБ.Почему это так?Есть ли способ сделать вышеперечисленное более эффективным с точки зрения памяти?

Я планирую увеличить указанный выше алгоритм для обработки нескольких десятков CSV-файлов, каждый размером> 200 МБ.Если каждый из соответствующих им объектов списка в R в 3 раза больше их исходного размера, я боюсь, что использование памяти очень быстро выйдет из-под контроля.

Спасибо!

1 Ответ

0 голосов
/ 14 октября 2018

Как отмечалось в разделе книги Advanced R , посвященном использованию памяти , числовые векторы занимают 8 байтов на элемент, целочисленные векторы занимают 4 байта на элемент, а сложные векторы занимают 16 байтов на элемент.element.

Следовательно, в зависимости от количества строк и столбцов во входном CSV-файле результирующий объект R может быть значительно больше, чем входной CSV-файл.

Исходя из объема доступной оперативной памяти на машине, используемой для обработки данных, пользователи R используют следующие стратегии для работы с ограниченной памятью, в том числе:

  • выборка: анализслучайная выборка входных данных,
  • подмножество: обработка данных в подмножествах, затем объединение результатов, и
  • агрегирование: агрегирование данных в более высокие единицы анализа, а затем их анализ.

Поскольку R загружает все объекты в память для их обработки, необходимо иметь не только достаточно ОЗУ для загрузки объекта, но также достаточно ОЗУ для обработки объекта, включая запись дополнительных выходных объектов.

Обратите внимание, что форматы хранения, такие как data.table и tibble, более эффективны, чем Base R data.frame, и могут сэкономить до 50% использования оперативной памяти, как я иллюстрирую в AmericanПример опроса сообщества .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...