Как я могу lazyLoad большие выходы модели, которые были сохранены с помощью saveRDS? - PullRequest
0 голосов
/ 29 марта 2020

У меня есть несколько сотен больших выходов модели (8 Гб), каждый из которых сохраняется в виде списка, содержащего много элементов (и подэлементов). Для дальнейшей работы со всеми этими выходами невозможно загрузить все 100 ГБ файлов сразу в среду, и я наткнулся на lazyLoad как возможное решение здесь , здесь и здесь . Но мне пока не удалось заставить код работать!

Я подозреваю, что проблема может быть связана с сохранением данных с использованием saveRDS() вместо save() (если я пытаюсь load() сохранить файл с saveRDS() это дает ошибку) но я не уверен.

У меня есть два вопроса:

1) Является ли lazyLoad правильным способом справиться с большими выходами для индексации и загрузка отдельных уровней структуры данных при вызове, а не хранение всего в памяти?

2) Что я делаю не так?

Я сделал несколько попыток в соответствии с этим:

e = local({readRDS("path/to/file.RData"); environment()})
tools:::makeLazyLoadDB(e, "path/to/file")
lazyLoad("path/to/file")

Но последняя строка (lazyLoad("path/to/file") дает NULL в результате.

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

Я благодарю вас!

1 Ответ

0 голосов
/ 01 апреля 2020

1) readRDS требует назначения в отличие от load, поэтому это работает:

e = local({df <- readRDS("path/to/file.RData"); environment()})
tools:::makeLazyLoadDB(e, "path/to/file")
lazyLoad("path/to/file")

Я должен сохранять свои файлы в соответствии с соглашением, используя .rds в качестве расширения при сохранении данных с использованием saveRDS.

2) Вероятно, в этом случае неправильный подход, так как при индексировании любого элемента «обещания» загружается весь файл, а не только проиндексированный элемент.

...