Я использую боке в качестве серверного приложения. Когда я делаю выборку на графике, я делаю некоторые действия в python и обновляю некоторые источники (CDS). Эти изменения нашли отражение в сюжете. Есть ли способ проверить, когда глифы полностью отрисовываются (после обновления)? Я хочу вызвать функцию JavaScript, когда все полностью загружено? С помощью этой функции я хочу вызвать другой метод Python, чтобы снова обновить CDS.
Если я не дождусь рендеринга этих профилей, возможно, приложение сломается, и этого я хочу избежать. На самом деле я провел несколько тестов в прошлом, и мне пришлось создать огромную CDS вместо нескольких небольших CDS, чтобы заставить ее работать правильно.
У меня в макете много вкладок, их может быть 10 например. И на каждой вкладке есть несколько графиков (3-6 графиков). Если я обновлю весь ColumnDataSource одновременно, это займет некоторое время. Затем я хочу сделать его более плавным, поэтому я хотел бы обновить только данные текущей видимой вкладки, она будет отображаться быстрее, и пользователь получит немедленный ответ. Я могу временно отключить остальные вкладки, чтобы предотвратить сбои. В этот момент мне нужно будет вызвать метод JS или python, чтобы обновить содержимое остальных вкладок.
Вот рисунок того, чего я хочу добиться, чтобы ускорить процесс:
По сути, у меня есть два DataFrames, один для построения облака точек (около 5000 строк и 130 столбцов), и я извлекаю из выбранных точек другой DataFrame, чтобы знать, какие линии я должен рисовать (360 столбцов и от 5 до 15 строк), создавая некоторые фильтры. и подборки. Алгоритм, который я использовал, находится в ответ вопроса, который я написал некоторое время назад. С таким объемом данных алгоритм завершается за 6 или 7 секунд.
Любая другая идея о том, как улучшить производительность или как разделить или вычислить?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Чтобы улучшить скорость рендеринга, вы можете попробовать webgl JavaScript API. На этой странице документации по боке Ускорение с помощью WebGL объясняется, как это сделать. webgl поддерживает круги, линии и большинство маркеров. Заявление:
p = Plot(output_backend = "webgl") # for the glyph API
p = figure(output_backend = "webgl") # for the plotting API
Имейте в виду, что пользователи сообщают о проблемах с webgl, таких как заикание графика и т. д., но это может сработать в вашем случае, в зависимости от того, какой тип глифов содержит ваш график.
Также убедитесь, что ваши данные, переданные на график, не включают NaN, поскольку известно, что они замедляют производительность боке.
Насколько мне известно, нет атрибута, указывающего, что рендеринг завершен или все еще продолжается., но вы можете подумать о некоторых других альтернативах для ускорения работы, таких как комбинация боке с Даташейдер (предварительный рендеринг больших наборов данных в растровое изображение фиксированного размера) или Даск (ускорение чтения данных из нескольких источников, таких как несколько файлов csv)
For example you could have one standard Bokeh plot where you make a selection and let the other plots being generated as Datashader images and embed them in Bokeh plots.
Этот пример показывает, как комбинировать Bokeh + Datashader, что значительно повышает производительность, особенно при перерисовке. Обратите внимание, что каждый раз, когда на график добавляется одна точка, вся область холста будет перерисовываться в браузере. Так работают браузеры. Datashader может предоставить одно изображение, поэтому обновление графика происходит намного быстрее, при этом вы все еще можете использовать инструменты панели инструментов, такие как масштабирование, панорамирование и т. д.
Также учитываются детали реализации кода Python. Использование, например. gridplot для связывания многих графиков может снизить производительность, поэтому лучше добавлять их по одному в корень документа и т. д.
Согласно документации, Dask удобен в следующих ситуациях: 1) Работа с большими наборами данных, даже если эти наборы данных не помещаются в памяти. 2) Ускорение длительных вычислений за счет использования многих ядер. 3) Распределенные вычисления на больших наборах данных со стандартными операциями Pandas, такими как группировка, объединение и вычисления временных рядов.
Спасибо за ваши возможные решения, но ни одно из них мне не помогло. webgl уже был включен. Я не могу использовать datashader, потому что мне нужно продолжать взаимодействие с образцами. Я также пытался использовать Dask Dataframe, но алгоритм занял еще больше времени (я думаю, из-за накладных расходов). В любом случае, я поддержу ваш ответ, потому что он может работать для других людей!
Некоторое время назад я сделал трюк, чтобы проверить, будет ли мой дизайн работать, если я смогу вызвать какую-то функцию, если графики будут отображаться:
Таким образом, подход с запуском функции, когда все отрендерено, не является хорошей идеей, потому что даже с таким обратным вызовом приложение не будет работать так, как я ожидал.
Спасибо, что уделили время написанию ответа. Я включил
webglс самого начала, это нормально. Я не уверен, смогу ли я использовать Datashader, потому что я должен иметь возможность постоянно использовать инструменты выбора, а не только инструменты панорамирования и масштабирования. Я не знал о Dask DataFrame, я обновил свой ответ более подробно, как вы думаете, этот тип DataFrame ускорит вычисление алгоритма с размером данных, с которым я работаю?