Утечка памяти Flot при связывании двух графиков с использованием панорамирования
Мы рендерим два графика с помощью flot, которые имеют одинаковую ось X. мы строим их с:
plot1 = $.plot($("#placeholderGraph1"), p1_data, d1_options);
plot2 = $.plot($("#placeholderGraph2"), p2_data, d2_options);
нам нужно убедиться, что панорамирование и масштабирование на одном графике также перерисовывают другой, и наоборот. мы достигаем этого с помощью следующего связывания:
$("#placeholderGraph1").bind("plotpan", adjustGraph1Axes);
$("#placeholderGraph2").bind("plotpan", adjustGraph2Axes);
Если мы не добавим эти два последних утверждения, утечки памяти не будет, и браузер (все браузеры) удаляет память всякий раз, когда перерисовывает. Но с вышеупомянутым связыванием браузер никогда не теряет память и накапливается до сотен мегабайт.
Помимо этого, мы также обновляем отдельные легенды движениями мыши.
мы пробовали следующие подходы для утечки памяти, но ни один не работал:
1. создание глобальных переменных plot1 и plot2 и явное удаление содержимого
2. Удаление графа div и воссоздание
3. Явно отменяющий привязку событий перед повторным связыванием
4. Построение пустого графика перед перерисовкой
Любые другие подходы к связыванию двух графов или дамп памяти?
2 ответа
Возможно, у меня была похожая проблема: синхронизация выделения на обзорном графике и панорамирование / масштабирование на основном графике; моя проблема заключалась в том, что обработчик событий для одного графика вызывал событие для другого графика, а выполнение соответствующего обработчика событий вызывало событие для первого графика, что приводило к выполнению исходного обработчика событий... что приводило к бесконечности петля.
Другими словами, вы уверены, что ваша проблема не в том, что выполнение adjustGraph1Axes
не вызывает plotpan
событие для графика 2, который вызывает выполнение adjustGraph2Axes
непреднамеренно, которые вызывают plotpan
для графика 1 и причин adjustGraph1Axes
выполнить и так далее? Мой пост вместе с решением находится здесь: Событие Flot для обновления диапазона в ответ на панорамирование / масштабирование.
Я использовал флаг для решения проблемы пинг-понга между двумя обработчиками событий, и мое решение находится по адресу < http://jsfiddle.net/apandit/nu2rr58h/12/ >.
Возможно, проблема связана с плагином Flot: jquery.flot.navigate.js.
Я предлагаю вам обновить JQuery до версии 1.5 вместе с плагином flot, упомянутым выше.
Возможно, вам захочется перейти по этой ссылке (см. ChangeLog в правой части):
https://code.google.com/p/flot/source/browse/trunk/jquery.flot.navigate.js?r=317