2017-08-15 9 views
1

バンドルされたJSファイルをコンパイルするWebpackを使用しています。大きなファイルを計算するときにブラウザがフリーズする(OOM?)JS暗号ライブラリを使用してMD5を読み取る

私は私はハッシュの作業負荷を軽減しています労働者を持っている問題

。私はファイルとファイルサイズを渡します。以前私は労働者を使わなかった。しかし、Chromeが大容量のファイルをハッシュするのに悪い反応を示した場合、主なスレッドがハッシュ機構によってブロックされていると考えました。これは誤った仮定である可能性があります。

コードは小さなファイルに対して正しく機能します。しかし、大きなファイルのために、一度最後のハッシュが生成された部分に到達し、クロムはこのエラーを示しています

Chrome error message

Firefoxがもう少し便利ですし、このメッセージを示しています。しかし

Error: Uncaught, unspecified "error" event. (out of memory)

をデータの配管はこの問題を緩和するはずです。 fileReaderStreamは、1 MBのチャンクでデータを読み取ります。

コード

import Crypto from 'crypto' 
import fileReaderStream from 'filereader-stream' 
import concat from 'concat-stream' 
var progress = require('progress-stream'); 

self.onmessage = (event) => { 
    switch (event.data.topic) { 
     case 'hash': { 
      var file = event.data.file; 
      var filesize = event.data.filesize; 

      let p1 = progress({ 
       length: filesize, 
       time: 100 /* ms */ 
      }); 
      let p2 = progress({ 
       length: filesize, 
       time: 100 /* ms */ 
      }); 

      p1.on('progress', function(progress) { 
       console.log('p1', progress); 
      }); 
      p2.on('progress', function(progress) { 
       console.log('p2', progress); 
      }); 

      let md5 = Crypto.createHash('md5'); 

      console.log("START HASH"); 
      var reader = fileReaderStream(file); 
      reader.pipe(p1).pipe(md5).pipe(p2).pipe(concat((data) => { 
       console.log("DONE HASH"); 
       console.log(data); 
      })); 

      break; 
     } 
    } 
} 

小ファイルの例(5248キロバイト)

Dev console log of uploading a small file

大容量ファイルの例(643メガバイト)

Dev console log of uploading a large file

追加情報

メモリ使用量のスクリーンショットそれは数秒で3 GBを要します。

Memory issue chart

+0

console.log出力が大量にあります – Jer

+0

@Jerこれは進行状況のためだけです。それほど多くはありません。私がそれを取り除くと、同じ問題が存在します。 (進捗状況のストリームは、この例では問題が発生しているコミュニティを示すインジケータとしてのみ表示されます) – Knossos

+0

サーバーにはどのくらいのメモリがありますか? – Jer

答えて

0

この1が不十分のメモリ管理に関して実装されているのであれば、それは別のライブラリを使用して価値がある可能性があります。

ライブラリはスタンフォード大学で実装されているJavaScriptのこの - https://bitwiseshiftleft.github.io/sjcl/

あなたはまた、それが誕生日の攻撃を介して、衝突に対する脆弱性だにMD5より安全なハッシュアルゴリズムを使用して検討する必要があります。

関連する問題