我正在尝试使用虚拟数据创建文件。由于该文件将包含32 ^ 5个数据点,因此非常庞大,因此我正在使用写流。但是我看不到任何数据正在写入文件。可能是什么原因?
const faker = require('faker');
const fs = require('fs');
const os = require('os');
const MAX_DATA_POINTS = Math.pow(32, 5)
const stream = fs.createWriteStream('sample-data.csv', { flags : 'a' });
for(let i = 0; i < MAX_DATA_POINTS; i++) {
console.log(i)
stream.write(`${faker.name.findName()}, ${i} ${os.EOL}`);
}
console.log(`Written ${MAX_DATA_POINTS} .. `);
答案 0 :(得分:0)
如果 stream 希望调用代码等待 drain 事件发出,然后继续执行操作,则write
方法将返回false
。写入其他数据,否则返回true。流很有可能没有耗尽,并且对write()
的调用只是缓冲块并返回 false 。
您将需要等待,直到所有缓冲的块都耗尽(操作系统接受此传递)。发生这种情况时,将发出耗尽事件。
注意:建议一旦write()返回false,在发出'drain'事件之前不要再写入任何块。
您可以按照我给的方式修改您的dummy-csv文件创建者代码。
const faker = require('faker');
const fs = require('fs');
const os = require('os');
const MAX_DATA_POINTS = Math.pow(32, 5);
let c = 0;
const stream = fs.createWriteStream('sample-data.csv', { flags : 'a' });
function write() {
let ok = true;
do {
c++;
ok = stream.write(`${faker.name.findName()}, ${c} ${os.EOL}`);
} while (c < MAX_DATA_POINTS && ok);
if(c < MAX_DATA_POINTS) {
stream.once('drain', write)
}
}
write()