重复data.table fread和fwrite导致 "Permission denied "错误。

问题描述 投票:2回答:1

我在使用 data.table fwrite()fread() 函数来管理并行计算中的资源,但也能够在下面的顺序示例代码中重新创建行为。调用 fwrite() 抛出以下错误。

Error in fwrite(dt, csv_path) : Permission denied: 'D:mypathtest.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-mingw32x64(64位)

运行在: Windows Server x64 (build 14393)

data.table_1.12.8

r data.table permission-denied r-4.0.0
1个回答
4
投票

我在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)
}

你可以试试下面的代码,看看是否可以在R中重现: 什么是有意义的?Sys.sleep 是足以让问题消失的。

© www.soinside.com 2019 - 2024. All rights reserved.