Повторяющиеся fread и fwrite data.table вызывают ошибку "Permission denied"

Я столкнулся с этой проблемой, используя data.table fwrite() а также fread()функции для управления ресурсами в параллельном вычислении, но также смог воссоздать поведение в приведенном ниже последовательном примере кода. Вызовfwrite() выдает следующую ошибку:

Ошибка в fwrite(dt, csv_path): Permission denied: 'D:/mypath/test.csv'. Не удалось открыть существующий файл для записи. У вас есть разрешение на запись? Это Windows и открыт ли другой процесс, например Excel?

Такое поведение, кажется, связано с вызовом fread() прямо перед тем, как комментировать fread()команда заставляет ошибку исчезнуть. В зависимости от вашей системы вам может потребоваться увеличить количество итераций, прежде чем ошибка возникнет, поскольку она возникает при различных количествах итераций.

У кого-нибудь есть идеи, почему это происходит? Заранее благодарим за помощь!

Пример кода:

library(data.table)

dt = data.table(a = c(1, 2), b = c("a", "b"))
csv_path = "D:/mypath/test.csv"
fwrite(dt, csv_path)

for(i in 1:10000){
  test = fread(csv_path)
  fwrite(dt, csv_path)
}

Системная информация

R версия 4.0.0 (24.04.2020)

Платформа: x86_64-w64-mingw32/x64 (64-бит)

Работает под управлением: Windows Server x64 (сборка 14393)

data.table_1.12.8

2 ответа

Решение

Я пробовал ваш код на машине с Windows, и мне не удалось его воспроизвести.

Я считаю, что проблема связана с обработчиком файлов Windows, который, похоже, недостаточно быстр, чтобы закрыть файловое соединение перед его повторным открытием.

Вы можете попробовать следующий код, чтобы узнать, воспроизводится ли он только в R:

x = "a,b\n1,a\n2,b\n"

csv_path = "D:/mypath/test.csv"
file.create(csv_path)
f = file(csv_path, "w")
cat(x, file=f)
close(f)

for (i in 1:10000) {
  f = file(csv_path, "r")
  test = readLines(f)
  close(f)
  f = file(csv_path, "w")
  cat(x, file=f)
  close(f)
}

Что также может иметь смысл, так это увидеть, насколько Sys.sleep достаточно, чтобы проблема исчезла.

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

data.table::getDTthreads()

Я получал то же самоеfread()ошибка, пока я не уменьшил это с96к24с

data.table::setDTthreads(threads = 24)

Другие пользователи сообщили о темах, < 79 работ. См. сбой .data.table с ошибкой сегментации при группировании с более чем 79 потоками #5077.

Другие вопросы по тегам