生成 1000 张导致重负载的图像



我是node.js的新手。我想通过imagick,gmagick生成许多图像以进行测试。映像的名称应介于 000001.jpg 到 0x.jpg 之间。对于以后的测试,我需要大约 50.000 张图像。

var async = require('async');
var gm = require('gm')
            .subClass({ imageMagick: true }); // Enable ImageMagick integration.

var number = parseInt(process.argv[2]) || 20;
console.log("Generating " + number + " images");
var pad = "000000";
var img_names = [];
for (i=1;i<=number;i++) {
    var str = "" + i;
    var padded_str = pad.substring(0, pad.length - str.length) + str;
    img_names.push(padded_str+".jpg");
}
async.forEach(img_names, function (item, callback){ 
    console.log(item); // print the key
    gm(800, 600, "#ddff99f3").font("Helvetica.ttf", 80)
    .drawText(150, 300, "# "+item)
    .write("./"+item, function (err) {
      if(err) {
        console.error(err);
        process.exit(1);
      }
    }); 
    callback(); // tell async that the iterator has completed
}, function(err) {
    console.log('iterating done');
});

问题是,当使用更高的图像时,ubuntu机器会启动大量的"转换"过程并进入沉重的负载。

谁能指出我正确的方向?亲切的问候,罗伯特

您需要

callback()函数移动到写入函数的回调中,因为迭代刚刚分叉gmagick,而不是实际上等待它完成。完成后,它会调用自己的回调 - 这是迭代的结束,因此应该调用forEach()函数的回调。

如上所述移动callback()将阻止async.forEach(),直到gm()功能完成。

如果您有一台多核计算机,则可以并行运行此函数,每个核心/超线程大约一个工作进程是明智的默认值。将forEach换成eachLimit()并将并行度设置为 8:

async.eachLimit(img_names, 8, function (item, callback){ 
    console.log(item); // print the key
    gm(800, 600, "#ddff99f3").font("Helvetica.ttf", 80)
    .drawText(150, 300, "# "+item)
    .write("./"+item, function (err) {
      if(err) {
        console.error(err);
        process.exit(1);
      }
      callback(); // tell async that the iterator has completed
    }); 
}, function(err) {
    console.log('iterating done');
});

最新更新