Мне нужно объединить два относительно больших набора данных в R
. A
имеет 651 052 наблюдения и 118 переменных , а B
содержит 38 208 наблюдений и 41 переменную , и я, буквально, не могу уменьшить размер данных дальше. Применение функции object.size()
показывает, что эти два набора данных занимают 610 МБ и 13 МБ в памяти соответственно.
Используемая мной машина имеет 64-разрядный процессор и 32 ГБ оперативной памяти. Тем не менее, при попытке объединить эти файлы R
выдает ошибки выделения памяти: Error: cannot allocate vector of size x Mb
! Я проверил похожие посты на SO и перепробовал многие из предложенных решений, но ни одно из них не было эффективным в моем случае: я проверил ограничение памяти с помощью memory.limit()
, который возвращает 32684
, который показывает, что R имеет доступ к максимально доступной памяти на моем компьютере. Кроме того, использование функции merge
из пакета data.table
также не решило проблему и вызвало ошибку выделения памяти.
Мне удалось разделить A
на две части и объединить (что на самом деле left_join
) каждую часть отдельно с B
после процедуры удара:
# open fresh R session
load(A)
load(B)
part_1 <- left_join(first_half_A, B)
save(part_1)
# close R
# re-open R
load(A)
load(B)
part_2 <- left_join(second_half_A, B)
save(part_2)
# close R
Получающиеся части занимают около 200 Mb
на диске, но когда я загружаю их в R
, они резко увеличиваются в размерах и занимают почти 25 Gb
, что, вопреки моим надеждам, чтобы эти части имели более управляемые размеры при перезагрузке в R
таким образом не позволяет мне загружать их оба, поэтому я могу комбинировать их, используя bind_rows
.
Учитывая, что добавление дополнительной оперативной памяти или использование платформ, таких как AWS, не будет возможным, что вы предлагаете преодолеть эту проблему? Решение, которое не должно входить в мир SQL
, высоко ценится.
PS. ниже вы можете увидеть вывод sessionInfo()
на моей машине:
> sessionInfo()
R version 3.6.2 (2019-12-12)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 16299)
Matrix products: default
locale:
[1] LC_COLLATE=English_Netherlands.1252 LC_CTYPE=English_Netherlands.1252 LC_MONETARY=English_Netherlands.1252 LC_NUMERIC=C
[5] LC_TIME=English_Netherlands.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
loaded via a namespace (and not attached):
[1] compiler_3.6.2 tools_3.6.2 knitr_1.28 xfun_0.12
Первое обновление
Что помогло мне совершить sh слияние было изменить тип некоторых переменных, где это возможно, в основном от numeric
до integer
, что приводит к дальнейшему уменьшению размера данных. Тем не менее, проблема выделения памяти по-прежнему остается в виде объединенного набора данных, который содержит 47M строк и 124 переменных, а занимает всего 235 МБ на диске, занимает все 32 ГБ ОЗУ при загрузке в сеансе fre sh R и не оставляет больше пространство для предстоящих анализов, которые также тяжелы в вычислительном отношении, такие как оценка нескольких смешанных моделей. Буду очень признателен за любые предложения, касающиеся этой ситуации, которые помогут мне продолжить.