1

我正在尝试使用虚拟数据创建文件。由于文件会很大,包含 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} .. `);
4

1 回答 1

0

如果希望调用代码在继续写入其他数据之前等待排放事件发出,则该write方法返回,否则返回 true。流很可能没有耗尽,并且调用只是缓冲块并返回falsefalsewrite()

您需要等到所有缓冲的块都被耗尽(操作系统接受交付)。发生这种情况时,将发出 drain 事件。

注意:建议一旦 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()
于 2019-04-24T10:29:29.633 回答