NodeJS:快速转换图像与数据的URI导致缓存,内存泄漏

问题描述:

我正在一个软件读取大量的图像,并处理这些图像喜欢读取它们的高度,宽度等 我来看到一个非常在将图像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的缓冲区一旦超出范围就不会删除内存。

请建议或帮助我应该如何进一步解决此问题。

不知道这是如何转化为你使用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)已过时的缓冲区。