2017-04-14 9 views
0

大量の画像を読み込んで高さや幅などの画像を処理するソフトウェアを開発中です 私は非常に画像urlをデータURIに変換する際に使用されるメモリが不都合な状況です。NodeJS:データURIで画像を高速に変換するとキャッシング、メモリリークが発生する

request.get(imageUrl, function (error, my_data, body) { 
    var imageBase64Data = new Buffer(body).toString('base64'); 
    var imageData = "data:" + my_data.headers["content-type"] + ";base64," + imageBase64Data; 
    // using the imageData in image processing using GraphicsMagick module 
}); 

今私が直面しています問題は、私のノードのプロセスは、これらのイメージを実行し、処理を開始するとき、それはすぐに1.7ギガバイト点で最大使用メモリを取得することです。 システムがメモリのエラーを出し始めます。

イメージURIをデータURIに変換するために使用されたバッファが、範囲外になったときにメモリを削除しないことを確認しました。

この問題を解決するには、どうすればよいかお教えください。

答えて

0

これがどのようにbase64エンコーディングでバッファを使用しているのかわかりません。しかし、これは私がバッファ作業を翻訳する方法です。 新しいバッファを作成すると、heapTotalとheapUsedが増加しました。これは使用されているブロックの数にはなりません。バッファを削除すると、ヒープのサイズは小さくなりますが、バッファで使用されたブロックの数に比例しません。あなたがそれを消費した後で、imageBase64Data = nullを試して設定することをお勧めします。ノードの内部GCは、次のスイープでそれらのブロックを解放します。

また、リクエストコールバックハンドラの無名関数内で変数が宣言されるため、メモリ内に新しいimageBase64Data imageDataが作成されます。要求の外に宣言してその中で参照すると、新しいデータが値を上書きする可能性があります。しかし、関数内の値を変更する際には注意が必要です。処理されたURLを参照して管理したい場合は、同じURLを何度も何度も処理しないように、メモやキャッシュに目を通すことをおすすめします。

ここでは、バッファをnullに設定したときのGCの動作を示す簡単なテストを示します。

→ node      
> process.memoryUsage() 
{ rss: 21639168, heapTotal: 10522624, heapUsed: 5058760 } 
> mybuf = require('buffer').Buffer 
{ [Function: Buffer] 
    poolSize: 8192, 
    from: [Function], 
    alloc: [Function], 
    allocUnsafe: [Function], 
    allocUnsafeSlow: [Function], 
    isBuffer: [Function: isBuffer], 
    compare: [Function: compare], 
    isEncoding: [Function], 
    concat: [Function], 
    byteLength: [Function: byteLength] } 
> var buf = new mybuf(56789) 
undefined 
> process.memoryUsage() 
{ rss: 24563712, heapTotal: 11571200, heapUsed: 6459632 } 
> buf = null 
null 
> process.memoryUsage() 
{ rss: 24756224, heapTotal: 11571200, heapUsed: 6591688 } 
> process.memoryUsage() 
{ rss: 24805376, heapTotal: 11571200, heapUsed: 6637832 } 
> process.memoryUsage() 
{ rss: 23359488, heapTotal: 8425472, heapUsed: 5567208 } 
> 

Nodejs 6.10.2

new Buffer(body)を使用してバッファを作成することは推奨されていませんと述べています。

関連する問題