2013-02-09 2 views
1

В cytoscape.js я пытаюсь изменить значения атрибутов двух узлов для каждого узла в сети с 329 узлами.cytoscape.js: улучшает производительность данных атрибута узла

Это работает, но занимает 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"); 

Я знаю, что если я устанавливаю атрибуты всех узлов в сети к тому же значению, это намного быстрее. Это занимает около полутора секунд:

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

Но поскольку я пытаюсь дать каждому узлу отдельные значения, я не могу этого сделать.

Любые идеи для улучшения производительности?

+0

Похоже, решение состоит в том, чтобы удалить все узлы и ребра, затем обновить атрибуты узла, а затем повторно добавить узлы и ребра. Принимает 0,2 секунды. –

ответ

2

Проблема с вызывающими функциями, такими как в цикле, заключается в том, что каждая итерация вызывает события и уведомления для рендеринга, поскольку визуальные обновления могут потребоваться. Как вы отметили, это не проблема при добавлении/загрузке в массовом порядке, потому что это только генерирует одно уведомление.

Идеальной архитектурой было бы загрузить все элементы, которые вам нужны, до интуиции cytoscape.js, а затем обновлять отдельные узлы по мере их изменения на сервере. Опрос сервера и обновление всех узлов, скорее всего, вызовут другие проблемы, кроме загрузки производительности.

+1

Я также добавил новую функцию '.batchData()' к главной ветке. Вы можете вызвать его в коллекции элементов (коллекция должна включать те, которые нужно изменить) или ядро ​​(всегда работает так, как ожидалось). – maxkfranz

+0

Вот пример: 'cy.batchData ({'n0': {foo: 1, bar: 1}, 'n1': {foo: 2, bar: 2}})' – maxkfranz

+0

Спасибо, что обратились к этому. Я думаю, что у меня законный прецедент ... то, что я пытался сделать, это создать «фильм», где я перехожу к условиям эксперимента, обновляя атрибуты узлов, которые сопоставляются с размером и цветом узла. Я не проверяю сервер, но запрашиваю данные для ответов на пользовательские события. Поэтому я бы предпочел не повторно инициализировать cytoscape.js каждый раз. В любом случае, спасибо за это! –

Смежные вопросы