2017-04-14 72 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.7GB。 系統開始給出內存錯誤。

我檢查瞭解到,用於將圖像url轉換爲Data URI的緩衝區一旦超出範圍就不會刪除內存。

請建議或幫助我應該如何進一步解決此問題。

回答

0

不知道這是如何轉化爲你使用base64編碼緩衝區。但這是我如何翻譯緩衝區的作品。 當你創建一個新的緩衝區時,它增加了heapTotal和heapUsed。雖然這不會轉化爲正在使用的塊的數量。刪除緩衝區的確會減小堆的大小,但與緩衝區中使用的塊的數量不成比例。我建議你消費後,嘗試設置imageBase64Data = null。節點的內部GC將在下一次掃描中釋放這些塊。

此外,由於變量是在請求回調處理程序匿名函數中聲明的,因此每次發出請求時都會在內存中創建一個新的imageBase64Data imageData。如果您在請求之外聲明並在新數據中引用它,則可能會覆蓋該值。但是你也需要小心,因爲你會改變函數內的值。如果你想保持引用處理的url,那麼我會建議尋找memonizing或緩存,所以你不會一次處理相同的url。

這是一個簡單的測試,它向您展示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)已過時的緩衝區。