#r #memory #purrr
#r #память #purrr
Вопрос:
У меня есть код, похожий на приведенный ниже:
purrr::walk(directories, function(directory) {
purrr::walk(list.files(directory), function(file) {
DoStuff %>% DoMoreStuff %>% write.csv(file)
})
})
Когда я запускаю эту функцию, у меня доступно примерно 10-12 ГБ оперативной памяти. Ни один из этих файлов или их выходных данных не превышает 4 ГБ. Тем не менее, я замечаю, когда я наблюдаю за использованием моей памяти во время выполнения этой функции, что использование моей оперативной памяти медленно увеличивается и увеличивается, пока я не достигну предела выделения памяти после обработки 7-8 файлов. Для меня это не имеет смысла, потому что я бы подумал, что если я не сохраняю объект, у меня, по сути, должен быть «чистый лист» каждый раз, когда .csv
записывается и возникает новый цикл. Я что-то делаю неправильно? Я предполагаю, что моя интерпретация того, как работает память, также неверна.
Комментарии:
1. Можете ли вы попробовать с
fwrite
иlapply
2. конечно, я попробую это и дам вам знать
3. Его удалось завершить без исчерпания выделенной памяти, так что это улучшение. Все еще кажется, что он использует больше, чем «должен». Если я сильно манипулирую своими данными (7,5 миллионов строк, 300 переменных) с точки зрения перевода всего в нижний регистр, преобразования типов данных, преобразования значений в NA и т.д. Перед записью в CSV, считаете ли вы, что производительность памяти значительно улучшится за счет использования
data.table
вместоtidyverse
набора функций и tibbles?4. Это очень расстраивает, не уверен, как наилучшим образом решить проблему. Я думаю, что большая часть использования оперативной памяти связана с копированием при изменении, поэтому я полагаю, что если я переключусь на data.table и изменю по ссылке, я смогу обойти это.
5. @akrun, итак, я потратил последние 24 часа (почти) на то, чтобы полностью переписать свою кодовую базу для использования
data.table
, а эффективность и скорость памяти на несколько световых лет выше. Для этого никогда не требуется более 1 ГБ оперативной памяти, потому что я избегаю копирования при изменении, и мне нужно загружать только один столбец в память при выполнении различных операций. Все еще есть пара вещей, которые нужно преобразовать, это может быть сложно, но я уверен, что я отправлю вопрос SO, если мне понадобится помощь, лол, ты ответил на все мои вопросы.