Я получаю сообщение:
cannot allocate vector of size 215.2 Mb
215.2 не кажется мне таким уж большим, особенно когда примеры, которые я видел, были в стратосфере 10 Гб.
Вот что я пытаюсь сделать:
Combined<-merge(x=SubjectsYOY,y=o2017,by="subjectkey",all.x=TRUE)
Итак, довольно простое левое соединение.
SubjectsYOY имеет 28 202 411 записей с 16 столбцами.
o2017 имеет 109 850 записей с 94 столбцами.
Мне также нужно сделать очень похожие слияния еще три раза после того, как я это сделаю.
Я пытался очень сильно уменьшить нагрузку на память, сохраняя объекты в файле .rda на моей машине, закрывая R, а затем загружая .rda в первую очередь. Очевидно, не сработало. Кроме того, пытаясь избежать удаления столбцов - возможно, есть более щадящая команда вместо слияния при работе с таким количеством записей?
Кроме того, поможет ли сортировка по размеру двух информационных фреймов по ключу субъекта заблаговременно?
У меня в память загружено пять фреймов данных, пока я пытаюсь это сделать. Ниже приводится некоторая информация по сеансу о том, что происходит с моим компьютером:
sessionInfo()
R version 3.4.3 (2017-11-30)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)
Matrix products: default
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
loaded via a namespace (and not attached):
[1] compiler_3.4.3 plyr_1.8.4 tools_3.4.3 yaml_2.2.0 Rcpp_0.12.17
Хвостовая часть следует:
Итак, я провел некоторые эксперименты и посмотрел на предел памяти.
memory.limit()
Он автоматически устанавливается на 32676.
Теперь я изменил его следующим образом:
memory.limit(326760+10000)
И мое первое большое слияние работает!
Теперь у меня есть еще 3 слияния. Следующий - o2018, и он снова содержит 94 уникальных и новых столбца, которые необходимо добавить к тому, что было создано ранее: 16 + 94, а теперь + 94 столбца. Это много!
Итак, я снова экспериментировал с изменением лимита памяти, не разбираясь в управлении памятью:
memory.limit(32676000+10000)
Обратите внимание на два дополнительных нуля. Но теперь я снова получаю ту же исходную ошибку.
Кто-нибудь думает, что объединение этих множественных слияний в одно поможет? Какой код для этого? Это лучший код или я должен попытаться эмулировать запуск SQL или что-то еще? Неважно, что это должно произойти.
Еще раз спасибо!