#sql #r
Вопрос:
После обновления с 3.6.3 до 4.1.1 еженедельный скрипт, который я запускаю, сломался. В частности, это вызывает ошибку:
In file.remove("temp.csv") :
cannot remove file 'temp.csv', reason 'Permission denied'
Чтобы вручную удалить файл temp.csv, я получаю файл, используемый rsession.exe ошибка из Windows. Если я перезапущу R в Rstudio, то оба файла.remove() и удаление вручную будут работать.
Возможно, в первую очередь я использую плохую стратегию, но код, вызывающий ошибку, — это бит:
write_csv(VPTS, "temp.csv")
VPTS <- read_csv("temp.csv", col_types = cols())
file.remove("temp.csv")
Для контекста VPTS поступает из импорта SQL с использованием SQLFetch (), и все форматы являются ненадежными, сбрасывая его в CSV и используя read_csv (), импортирует его идеально для использования в будущем.
Я уверен, что это не проблема с разрешениями, но что-то в обновленном R не освобождает созданный им файл. Я просто хочу, чтобы мне указали направление для продолжения устранения неполадок на этом этапе.
Комментарии:
1. Я бы, вероятно, воспользовался этим как возможностью взглянуть на другие способы импорта из SQL: dbplyr.tidyverse.org/articles/…
2. у базы R
read.csv
иwrite.csv
есть те же проблемы?3. @cory, они этого не делают, поэтому теперь я должен выяснить, что не так с моим пакетом readr. read.csv не соответствует моему нижестоящему использованию, но интересно знать, что, похоже, проблема в пакете.
Ответ №1:
readr
версия >=2.0 и >< 2.1 используется vroom
для быстрого импорта данных и по умолчанию используется для ленивой загрузки данных, из-за чего файл заблокирован, что не позволяет его удалить. Вам нужно было явно отключить ленивое чтение с помощью
VPTS <- read_csv("temp.csv", col_types = cols(), lazy=FALSE)
Эта информация была упомянута в списке изменений в версии 2.0.0.
На удаление файлов после чтения также влияет лень. В Windows открытые файлы не могут быть удалены до тех пор, пока процесс не откроет файл. Поскольку readr сохраняет файл открытым при ленивом чтении, это означает, что вы не можете читать, а затем немедленно удалите файл. readr в большинстве случаев закроет файл, как только он будет полностью прочитан. Однако, если вы знаете, что хотите иметь возможность удалить файл после чтения, лучше всего передать lazy = FALSE при чтении файла
Примечание об обновлении начиная с версии readr
2.1, отложенное чтение больше не используется по умолчанию (именно из-за подобных ошибок). Это предотвратит возникновение ошибки «отказано в разрешении». Но если вы хотите быстрее считывать данные, теперь вам нужно будет установить lazy=TRUE
их явно.
Комментарии:
1. Спасибо, в этом-то и была вся проблема. Извлеченный урок: читайте журналы изменений, когда что-то ломается после обновления.