如何使用并行/多线程Hamsters.js Javascript库编辑数组中的对象属性



当使用Hamster.js时,我们必须将参数数组定义为params={"array":my_array}

my_array是由具有许多属性的元素组成的,我需要更改属性x和y。

在我传递给Hamster.js的函数中,我定义了:

function map_node_hamster() {
        params.array.forEach(function (d) {
            d.x = some_calculation_here;           
            d.y = other_calculation_here;
        }
}

但是在调用仓鼠.run()函数之后,我的原始数组的元素保持不变。由于我需要性能,我认为Hamsters可以更改我的数组所指向的值。实际上,我对Javascript以及它如何管理数组了解不多。

我这样调用run函数:

console.log("Before hamster:");
console.log(network.nodes);
p = {'array': network.nodes, "w": w, "h":h};
hamsters.run(p, map_node_hamster, function(output){console.log(output); return output;}, hamsters.maxThreads, true);
console.log("After hamster:");
console.log(network.nodes);

在仓鼠.run().之后,network.node的元素完好无损

如何更改run函数中数组的元素?或如何进行更改才是正确的方法?

由于矢量节点很大,复制、排序等操作会降低性能,而且可能比单线程/非并行版本更糟糕。

答案似乎是创建一个索引数组并更改回调函数(输出)中的节点。

尽管我的"网络的d3图形表示"的行为真的不是我所期望的。。。也许从回答我的问题(如何使用Hamsters.js在并行计算中更改数组中的对象)的意义上讲,这段代码实际上是正确的

            p = {'array': network.indexes,
                "nodes": network.nodes,                
                "w": w,
                "h": h};
            hamsters.run(p, map_node_hamster, function (output) {
                output.forEach(function (d) {
                    network.nodes[d.i].x = d.xy[0];
                    network.nodes[d.i].y = d.xy[1];
                });
                return output;
            }, cores, true);

而且。。。将功能更改为这样工作:

function map_node_hamster() {
        pfor (var i = 0; i < params.array.length; i++) {
            var result;
            var d = params.nodes[params.array[i]];
            var d = params.nodes[params.array[i]];
            result = {x: d.x calculation, y: d.y calculation};
            rtn.data.push({"i": params.array[i], "xy": [result.x, result.y]});
        }
}

最新更新