1

cytoscape.js で、329 ノードのネットワーク内の各ノードについて、2 つのノード属性の値を変更しようとしています。

これは機能しますが、86 秒かかります。私はそれがはるかに速いことを望んでいました。これが私のコードです:

var data = // data of the form {lfc: {key1: 0.01, key2: 0.02, ...}, pval: {key1: 0.03,  key2: 0.04, ...}};
var nodes = cy.nodes();
console.log('starting to update node data...');
var start = new Date().getTime();
for (var i = 0; i < nodes.length; i++)
{
  var node = nodes[i];
  var id = node.data("id");
  var lfc = data['lfc'][id];
  var pval = data['pval'][id];
  node.data({lfc: lfc, pval: pval});
}
var end = new Date().getTime();
console.log("finished in " + (end - start) + "ms");

ネットワーク内のすべてのノードの属性を同じ値に設定すると、はるかに高速になります。これには約 0.5 秒かかります。

var start = new Date().getTime();
cy.nodes().data({lfc: 1.0, pval: 1.0});
var end = new Date().getTime();
console.log("finished in " + (end - start) + "ms");

しかし、各ノードに個別の値を与えようとしているので、これはできません。

パフォーマンスを向上させるためのアイデアはありますか?

4

1 に答える 1

2

ループ内でそのような関数を呼び出す際の問題は、視覚的な更新が必要になる可能性があるため、反復ごとにイベントとレンダラーへの通知が発生することです。ご指摘のとおり、一括で追加/読み込みする場合、これは 1 つの通知しか生成しないため、問題になりません。

理想的なアーキテクチャは、cytoscape.js を初期化する前に必要なすべての要素をロードし、サーバー上で変更されたときに個々のノードを更新することです。サーバーをポーリングしてすべてのノードを更新すると、読み込みパフォーマンス以外の問題が発生する可能性があります。

于 2013-02-11T17:54:30.667 に答える