当使用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]});
}
}