Кэш дорогие операции в R

Очень простой вопрос:

Я пишу и запускаю свои скрипты R с помощью текстового редактора для создания их восстанавливаемыми, как был предложен несколькими членами ТАК.

Этот подход работает очень хорошо на меня, но я иногда должен выполнять дорогие операции (например. read.csv или reshape на базах данных 2M-строки), что я должен кэшироваться в среде R, а не повторно выполниться каждый раз, я запускаю скрипт (который является обычно много раз, в то время как я прогрессирую и тестирую новые строки кода).

Существует ли способ кэшировать то, что сценарий приводит в порядок до определенного момента так каждый раз, когда я только выполняю возрастающие строки кода (как я сделал бы путем выполнения R в интерактивном режиме)?

Спасибо.

8
задан smci 11 May 2016 в 00:06
поделиться

5 ответов

## load the file from disk only if it 
## hasn't already been read into a variable
if(!(exists("mytable")){
  mytable=read.csv(...)
}

Edit: исправлена ​​опечатка - спасибо Дирку.

9
ответ дан 5 December 2019 в 05:25
поделиться

Некоторые простые способы можно выполнить с помощью некоторых комбинаций

  • exists("foo") для проверки существования переменной, иначе повторная загрузка или повторный расчет
  • file.info("foo.Rd")$ctime, который вы можете сравнить с Sys.time() и посмотреть, если он новее, чем заданное количество времени, вы можете загружать, иначе повторный расчет.

На CRAN также есть пакеты кэширования, которые могут быть полезны.

8
ответ дан 5 December 2019 в 05:25
поделиться

После того как вы сделаете что-то, что, как вы обнаружили, требует больших затрат, сохраните результаты этого затратного шага в файле данных R.

Например, если вы загрузили csv во фрейм данных под названием myVeryLargeDataFrame, а затем создали сводную статистику из этого фрейма данных в df под названием VLDFSummary, вы можете сделать следующее:

save(c(myVeryLargeDataFrame, VLDFSummary), 
  file="~/myProject/cachedData/VLDF.RData", 
  compress="bzip2")

Опция compress здесь необязательна и должна использоваться, если вы хотите сжать файл, записываемый на диск. Подробнее см. в ?save.

После сохранения файла RData вы можете закомментировать шаги медленной загрузки данных и подведения итогов, а также шаг сохранения и просто загрузить данные следующим образом:

load("~/myProject/cachedData/VLDF.RData")

Этот ответ не зависит от редактора. Он работает одинаково для Emacs, TextMate и т.д. Вы можете сохранять данные в любое место на вашем компьютере. Однако я рекомендую сохранить медленный код в файле сценария R, чтобы вы всегда знали, откуда взялся ваш файл RData, и при необходимости могли воссоздать его из исходных данных.

4
ответ дан 5 December 2019 в 05:25
поделиться

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

3
ответ дан 5 December 2019 в 05:25
поделиться

Не вдаваясь в подробности, я обычно использую один из трех подходов:

  1. Используйте assign , чтобы присвоить уникальное имя каждому важному объекту на протяжении всего моего выполнения. Затем добавьте if (exists (...)) get (...) в начало каждой функции, чтобы получить значение, или пересчитайте его. (то же, что и предложение Дирка)
  2. Используйте cacheSweave с моими документами Sweave . Это делает за вас всю работу по кэшированию вычислений и автоматически извлекает их. Это действительно тривиально: просто используйте драйвер cacheSweave и добавьте этот флаг в каждый блок: << ..., cache = true >> =
  3. Используйте save и load , чтобы спасти окружающую среду в критические моменты, снова убедившись, что все имена уникальны.
3
ответ дан 5 December 2019 в 05:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: