循环二进制Float64Array文件 – NodeJS

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

每行需要触发一个事件来做一些计算。 使用npm read-line lib,通过pipe道读取CSV,我可以每秒处理大约1000000个周期(1节点线程)。

但是这个过程做了很多步骤,只是为了得到一些数字

  1. 打开.csv文件stream
  2. 将每个块串联起来
  3. 在块中search新行\ n
  4. 将该行分割成一个数组(3个单元格)
  5. parseFloat每个单元格

所以要parsing它们甚至更快,我虽然将csv文件转换为二进制文件可以帮助。 所以我创build了一个二进制Float64Array缓冲区文件,因为单元格中的所有值都是浮点数。

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文件stream
  2. 将每个stream缓冲区块(chunk = 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中逐行parsing其内容。

但由于某种原因,看起来比读取csv(文本)文件慢,逐行分割,用逗号分割,对单元格执行parseFloat。

我没有看到二进制,缓冲区和TypedArrays的更大的图片吗?

谢谢

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

你可以使用3个Float64参数,或直接在块上工作。

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