Left_join: Ошибка: невозможно выделить вектор размером «маленький» Мб - PullRequest
0 голосов
/ 28 августа 2018

Я работаю с довольно большими фреймами данных, в качестве экстремального - фрейм данных с около 300 000 строк и 1,500 переменных. Из-за этого при работе с этими кадрами данных иногда я получаю сообщение об ошибке:

Error: cannot allocate vector of size x.x Gb

В основном это означает, что я должен разбить свой код на более мелкие шаги или полностью изменить свой подход.

В данный момент я делаю несколько выборок и left_join, которые выглядят примерно так:

#Subsetting the main dataframe
df2 <- select(df1, matchcode, x1, x2, x3)
#Joining variables from a third dataframe
df2 <- df2 %>% left_join(select(df3, matchcode, y1, y2, y3), by="matchcode")

Выбор части идет отлично. Странно, однако, что теперь я получаю эти ошибки при использовании left_join, когда сумма, которая не может быть выделена, очень мала:

Error: cannot allocate vector of size 2.6 Mb
Error: cannot allocate vector of size 4.0 Mb
Error: cannot allocate vector of size 2.6 Mb

Существуют ли другие проблемы, которые могут привести к этим ошибкам, о которых я не знаю, или в моем коде имеется ошибка?

1 Ответ

0 голосов
/ 29 августа 2018

С момента публикации этого вопроса я провел некоторое исследование. Сначала я подумал, что ошибки связаны с количеством (размером) объектов в моем рабочем пространстве, а это не так.

Самый важный ответ на мой собственный вопрос (пожалуйста, не стесняйтесь уточнять это) заключается в том, что размер вектора, который не может быть выделен, не обязательно говорит о том, что операция делает с памятью.

Оказалось, что одна из ошибок произошла из-за того, что я пытался выполнить объединение «многие ко многим» в двух огромных наборах данных, что привело к ошибке:

Error: cannot allocate vector of size 140.4 Mb

Другие объединения были один-ко-многим (что привело к значительно меньшим ошибкам, см. Оригинальный пост). Мне удалось присоединиться к этим фреймам данных, используя вместо этого решение data.table;

library(data.table)
df1 <- merge(df1, df2, by= "matchcode", all.x = TRUE, allow.cartesian=TRUE)

При объединении «многие ко многим» я свернул один из наборов данных, чтобы объединение стало «один ко многим». Надеюсь, это поможет.

...