0

を使用して配列から属性{「アレイ」:my_arrayで}はHamster.jsを使用している場合、我々は のparams =としてパラメータ配列を定義する必要があり、並列/ Hamsters.js Javascriptのlibがマルチスレッド

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; 
     } 
} 

をしかしhamster.run()関数を呼び出した後、私の元の配列の要素はそのままご利用いただけます。 パフォーマンスが必要なので、私はハムスターズが私の配列が指している値を変更できると思った。私は実際にはJavascriptとそれがどのように配列を管理するかについてはあまり知らない。

私はこのような実行機能を呼んでいる。)

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); 

そしてnetwork.nodesの要素は、(hamsters.run後に無傷です。

実行機能内で配列の要素を変更するにはどうすればよいですか?または..どのように変更を行う正しい方法でしょうか?

ベクターノードが大きいほど、コピー、並べ替えなどの処理がパフォーマンスが低下し、シングルスレッド/非パラレルバージョンよりも悪くなる可能性があります。

答えて

0

答えは、インデックス配列を作成し、コールバック関数(出力)でノードを変更するようです。

"ネットワークのd3グラフィック表示"の動作は実際に私が期待していたものではありません...おそらくコードは実際に私の質問に答える意味で正しいです(ハムスターと並列コンピューティングでアレイからオブジェクトを変更する方法.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]}); 
     } 
} 
関連する問題