Управление использованием памяти в цикле обхода purrr

#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, если мне понадобится помощь, лол, ты ответил на все мои вопросы.