gpt4 book ai didi

javascript - 在 Node.js 中循环写入文件时可能出现数据不一致

转载 作者:行者123 更新时间:2023-11-30 11:23:58 26 4
gpt4 key购买 nike

我有一个数组,比如 100000 个对象。我使用 map 函数,在每次迭代中,我构建一个字符串并将内容写入 CSV,如下所示:

  entriesArray.map((entry) => {
let str = entry.id + ',' + entry.fname + ',' + entry.lname + ',' +
entry.address + ',' + entry.age + ',' + entry.sex + '\n'
writeToFile(str);
});

writeToFile 函数:

const writeToFile = (str) => {
fs.appendFile(outputFileName + '.csv', str, (err) => {
if (err) throw err;
});
};

这按预期工作,但我担心如果有这么多异步写入操作会导致任何数据不一致。所以我的问题是,这安全吗?或者是否有更好的方法。

顺便说一句,MAC 操作系统上的相同代码引发错误错误:ENFILE:文件表溢出,打开“output.csv”。通过一些研究,我了解到这是由于 OSX 的打开文件限制非常低。有关这方面的更多详细信息,请参见 here .

我再次希望通过改进我的文件写入机制来解决这个问题。

最佳答案

您意识到这不是一种好的编码方式是正确的,因为异步写入不能保证顺序(特别是如果写入很大并且可能需要多次实际写入磁盘操作)。并且,请记住 fs.appendfile() 实际上包含三个异步操作 fs.open()fs.write()fs.close()。而且,正如您所见,这会同时打开大量文件句柄,因为它会尝试并行执行每个单独的写入操作。这些都不是必需的。

我建议您将要写入的文本构建为字符串,并在末尾写入一个,因为似乎没有理由实际单独写入每个文本。这也会更有效率:

writeToFile(entriesArray.map((entry) => {
return entry.id + ',' + entry.fname + ',' + entry.lname + ',' +
entry.address + ',' + entry.age + ',' + entry.sex + '\n';
}).join(""));

假设您的 entriesArray 中有 1000 个项目。您的方案是为每个条目执行 3000 次磁盘操作打开、写入和关闭。我建议的代码执行 3 个磁盘操作。这应该明显更快并且有保证的写入顺序。


此外,您确实需要考虑适当的错误处理。使用类似的东西:

if (err) throw err;

在异步回调中没有正确的错误处理。这会引发您无法处理的异步事件。这是计划:

const writeToFile = (str, fn) => {
fs.appendFile(outputFileName + '.csv', str, (err) => {
fn(err);
});
};

writeToFile(entriesArray.map((entry) => {
return entry.id + ',' + entry.fname + ',' + entry.lname + ',' +
entry.address + ',' + entry.age + ',' + entry.sex + '\n';
}).join(""), function(err) {
if (err) {
// error here
} else {
// success here
}
});

关于javascript - 在 Node.js 中循环写入文件时可能出现数据不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48734003/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com