Распространение очень длинного набора данных - проблемы с производительностью - PullRequest
0 голосов
/ 09 апреля 2019

Я пытаюсь распространить очень длинный фрейм данных (17 000 000 строк; файл RDS 111,2 МБ) в широкий формат с помощью переменной с ~ 2000 уникальных значений. Выполнение этого на 16-ядерном 64-ГБ ОЗУ на машине linux приводит к Error: cannot allocate vector of size 3132.3GB.

Код dplyr, приведенный ниже, отлично работает с небольшими наборами данных (размер ~ 1/3).

data <- data %>%
  rowid_to_column() %>%
  spread(key = parameter_name, value = value) %>%
  select(-rowid)

Есть идеи сделать это? Более эффективное кодирование?

Ответы [ 2 ]

0 голосов
/ 10 апреля 2019

Мне кажется, что вы пытаетесь создать 17e6 x 2000 data.frame, что совершенно неразумно (так как в каждой строке будет только одно значение).

Если ваши значения целочисленные, то результирующееdata.frame будет иметь размер:

v <- sample.int(17e6)
format(object.size(v) * 2000, units = 'Gb')
# [1] "126.7 Gb"

или double:

v <- rnorm(17e6)
format(object.size(v) * 2000, units = 'Gb')
# [1] "253.3 Gb"

Возможно, вам следует изучить разреженные матрицы или переосмыслить то, что вы делаете.

Контрольный пример для 200k x 2000 с data.table:

N <- 200000
n <- 2000
require(data.table)
dt <- data.table(parameter_name = sample.int(n, N, T), value = rnorm(N), id = 1:N)
r <- dcast(dt, id ~ parameter_name)
format(object.size(r), units = 'Gb')
# [1] "3 Gb"

Результаты уже в 3 ГБ.

0 голосов
/ 09 апреля 2019

преобразования data.table более эффективны для памяти и быстрее, хотя dplyr более удобны.

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