我有100個CSV文件,每個約50.000.000行,每個包含3個單元格。循環二進制Float64Array文件 - NodeJS
每一行都需要觸發一個事件來做一些計算。 使用npm read-line lib,通過管道讀取CSV,我可以每秒獲得大約1.000.000個週期的進程(1節點線程)。
但是這個過程中做了很多的措施,只是爲了得到一些數字
- 打開.csv文件流
- 字符串化每塊
- 搜索新行\ n的塊
- 斯普利特該行成陣列(3個單元格)
- parseFloat every cell
因此,要更快地解析它們,我將csv文件轉換爲二進制文件可能會有所幫助。所以我創建了一個二進制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文件流
轉換每個數據流緩存器塊(塊= 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。
我沒看到二進制文件,緩衝區和TypedArrays的大圖嗎?
感謝
確實。我增加了塊大小,爲它做了一個緩衝區,它已經變好了很多。非常愚蠢,因爲我一次只讀24個字節,調用一個包含所有'背景'處理的Float64Array構造函數,並且期望好的結果。如果你想到它,每秒鐘750.000的速度仍然很快。現在達到將近10.000.000 p/s :)謝謝 – DutchKevv