Повторяющиеся 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.