r - 重复 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
解决方案
我在 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
足以让问题消失。
推荐阅读
- python - 不能cd到不同的目录
- null - 当成员为 IEnumerable 时,有没有办法在使用 Mapster 进行映射期间忽略源中的所有空值
- sql - 如何提高包含 Update 的 Merge 语句的性能
- apache-flink - 当 Flink 源算子为并行时,单个分区的输入顺序是否有保证?
- php - 未生成 PHP-FPM 核心转储
- flutter - 来自API的Flutter ListView分页?
- javascript - onClick 事件监听器在一段时间内
- c++ - 类模板继承的“尚未声明”错误
- java - 在 Java 中使用过滤器表达式的 DynamoDb 查询
- flutter - FutureBuilder 没有进入 builder?