バンドルされたJSファイルをコンパイルするWebpackを使用しています。大きなファイルを計算するときにブラウザがフリーズする(OOM?)JS暗号ライブラリを使用してMD5を読み取る
私は私はハッシュの作業負荷を軽減しています労働者を持っている問題
。私はファイルとファイルサイズを渡します。以前私は労働者を使わなかった。しかし、Chromeが大容量のファイルをハッシュするのに悪い反応を示した場合、主なスレッドがハッシュ機構によってブロックされていると考えました。これは誤った仮定である可能性があります。
コードは小さなファイルに対して正しく機能します。しかし、大きなファイルのために、一度最後のハッシュが生成された部分に到達し、クロムはこのエラーを示しています
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キロバイト)
大容量ファイルの例(643メガバイト)
追加情報
メモリ使用量のスクリーンショットそれは数秒で3 GBを要します。
console.log出力が大量にあります – Jer
@Jerこれは進行状況のためだけです。それほど多くはありません。私がそれを取り除くと、同じ問題が存在します。 (進捗状況のストリームは、この例では問題が発生しているコミュニティを示すインジケータとしてのみ表示されます) – Knossos
サーバーにはどのくらいのメモリがありますか? – Jer