2016-09-01 69 views
1

我有100個CSV文件,每個約50.000.000行,每個包含3個單元格。循環二進制Float64Array文件 - NodeJS

每一行都需要觸發一個事件來做一些計算。 使用npm read-line lib,通過管道讀取CSV,我可以每秒獲得大約1.000.000個週期的進程(1節點線程)。

但是這個過程中做了很多的措施,只是爲了得到一些數字

  1. 打開.csv文件流
  2. 字符串化每塊
  3. 搜索新行\ n的塊
  4. 斯普利特該行成陣列(3個單元格)
  5. 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() 

然後它只有這樣做步驟

  1. 打開bin文件流
  2. 轉換每個數據流緩存器塊(塊= 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的大圖嗎?

感謝

回答

1

我認爲瓶頸是new Float64Array每個(小)塊。

您可以改用3個Float64參數,或直接在塊上工作。

或在更大的塊上使用Float64Array,並使用相同的Float64Array重複調用該函數。

+0

確實。我增加了塊大小,爲它做了一個緩衝區,它已經變好了很多。非常愚蠢,因爲我一次只讀24個字節,調用一個包含所有'背景'處理的Float64Array構造函數,並且期望好的結果。如果你想到它,每秒鐘750.000的速度仍然很快。現在達到將近10.000.000 p/s :)謝謝 – DutchKevv