gpt4 book ai didi

node.js - 循环二进制 Float64Array 文件 - NodeJS

转载 作者:太空宇宙 更新时间:2023-11-04 00:35:22 24 4
gpt4 key购买 nike

我有 100 个 CSV 文件,每个文件大约 50.000.000 行,每个文件包含 3 个单元格。

每一行都需要触发一个事件来进行一些计算。使用 npm read-line lib(通过管道读取 CSV),我每秒可以获得大约 1.000.000 个该进程的周期(1 个 Node 线程)。

但是这个过程执行了很多步骤,只是为了获得一些数字

  1. 打开 .csv 文件流
  2. 对每个 block 进行字符串化
  3. 在 block 中搜索新行\n
  4. 将该行拆分为一个数组(3 个单元格)
  5. parseFloat 每个单元格

因此,为了更快地解析它们,我将 csv 文件转换为二进制文件可能会有所帮助。因此,我创建了一个二进制 Float64Array 缓冲区文件,因为单元格中的所有值都是 float 。

let counter = 0 ;;
rows.forEach(function (row) {

row.forEach(function(cell) {

buffer.writeDoubleLE(cell, counter++ * Float64Array.BYTES_PER_ELEMENT);
})
});
writeStream.write(buffer)
writeStream.end()

那么只需要做这一步

  1. 打开.bin文件流
  2. 将每个流缓冲区 block ( block = 3 个单元)转换为 ArrayBuffer 到 Array64Float

    fs.createReadStream(fileName, {highWaterMark: 24})
    //.pause()
    .on('data', chunk => {
    //this._stream.pause();

    this._bufferOffset = 0;

    this.emit('tick', new Float64Array(chunk.buffer, chunk.byteOffset, chunk.byteLength / Float64Array.BYTES_PER_ELEMENT));
    })
    .on('close', () => {
    let nextFile = this._getNextBINFilePath();

    if (!nextFile) {
    return this.emit('end');
    }

    this._initTestStream();
    })

到目前为止一切都很好。我可以读取二进制文件并在 Float64Array 中逐行解析其内容。

但由于某种原因,它似乎比读取 csv(文本)文件、按行分割、用逗号分割、对单元格执行 parseFloat 慢。

我没有看到二进制、缓冲区和 TypedArray 的大局吗?

谢谢

最佳答案

我认为瓶颈是每个(小) block 的new Float64Array

您可以使用 3 个 Float64 参数,或者直接处理 block 。

或者在更大的 block 上使用Float64Array,并使用相同的Float64Array重复调用该函数。

关于node.js - 循环二进制 Float64Array 文件 - NodeJS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39275688/

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