2016-09-01 4 views
1

私は100のCSVファイルを持っています。各ファイルは約50.000.000行で、それぞれに3つのセルが含まれています。バイナリFloat64Arrayファイル上のループ - NodeJS

各行は、いくつかの計算を行うためにイベントをトリガする必要があります。 パイプを介してCSVを読み込むnpmリードラインlibでは、1秒間に約1.000.000サイクルの処理(1ノードスレッド)を得ることができました。

しかし、このプロセスはいくつかの数字

  1. オープン.csvファイルストリーム
  2. 文字列化、各チャンク
  3. チャンクで改行\ nの
  4. 検索
  5. 分割を取得するには、手順の多くを行います配列にその行(3セル)
  6. すべてのセルを解析する

これをさらに高速に解析するには、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. 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(); 
        }) 
    
  3. をArray64FloatするArrayBufferに、すべてのストリームバッファチャンク(チャンク= 3セル)を変換する手順は関係ありません

これまでのところすべて良いです。私はバイナリファイルを読み込み、その内容をFloat64Arrayの行ごとに解析することができます。

しかし何らかの理由で、CSV(テキスト)ファイルを読み込み、行単位で分割し、コンマで分割し、セル上でparseFloatを実行するよりも遅いようです。

私は、バイナリ、バッファ、TypedArraysの大きな画像が見えませんか?

おかげ

答えて

1

私はボトルネックがそれぞれ(小さな)チャンクのnew Float64Arrayだと思います。

代わりに3つのFloat64パラメータを使用することも、直接チャンクで作業することもできます。

さらに大きなチャンクでFloat64Arrayを使用し、同じFloat64Arrayを使用してこの関数を繰り返し呼び出します。

+0

確かに。私はチャンクサイズを増やし、バッファーを作成しました。そしてそれはすでにずっと良くなっています。私は一度に24バイトを読んでいたので、すべての 'バックグラウンド'処理を含むFloat64Arrayコンストラクタを呼び出し、期待された結果が得られました。あなたはそれを考えると、毎秒750.000がまだまだ速かった...ほぼ10.000.000に達しましたp/s :)ありがとう – DutchKevv

関連する問題