gpt4 book ai didi

node.js - 生成数千张图像导致负载过重

转载 作者:太空宇宙 更新时间:2023-11-04 03:09:12 25 4
gpt4 key购买 nike

我是 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() 函数移至 write 函数的回调中,因为迭代刚刚 fork 了 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');
});

关于node.js - 生成数千张图像导致负载过重,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29059689/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com