循环二进制Float64Array文件 – NodeJS
我有100个CSV文件,每个约50.000.000行,每个包含3个单元格。
每行需要触发一个事件来做一些计算。 使用npm read-line lib,通过pipe道读取CSV,我可以每秒处理大约1000000个周期(1节点线程)。
但是这个过程做了很多步骤,只是为了得到一些数字
- 打开.csv文件stream
- 将每个块串联起来
- 在块中search新行\ n
- 将该行分割成一个数组(3个单元格)
- 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()
那么它只需要做这个步骤
- 打开.bin文件stream
-
将每个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
重复调用该函数。