首页 > 解决方案 > 重复 data.table fread 和 fwrite 导致“权限被拒绝”错误

问题描述

data.table fwrite()我使用and函数在并行计算中管理资源时遇到了这个问题fread(),但也能够在下面的顺序示例代码中重新创建行为。调用fwrite()会引发以下错误:

fwrite(dt, csv_path) 中的错误:权限被拒绝:'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 (2020-04-24)

平台:x86_64-w64-mingw32/x64(64位)

运行于:Windows Server x64(内部版本 14393)

data.table_1.12.8

标签: rdata.tablepermission-deniedr-4.0.0

解决方案


我在 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足以让问题消失。


推荐阅读