Как предотвратить заикание "оживленного" сюжета боке - PullRequest
0 голосов
/ 02 апреля 2019

Я пытаюсь создать своего рода приборную панель для мониторинга данных ЭКГ и соответствующих функций. При «оживлении» ЭКГ путем постоянного обновления двух ColumnDataSource с, очень скоро сюжет начинает заикаться и становится медленным. В данный момент я запускаю это в ноутбуке, но то же самое с сервером bokeh.

Сама ЭКГ показывает около последней секунды, около 400 точек данных в строке. Оставленный сам по себе, он работает почти гладко, но это не очень полезно, с точки зрения панели управления. На другом графике показана вариабельность сердечного ритма, возможно, дюжина кругов, но полученная из последней минуты данных, таким образом, из двух источников.

Кажется, что чем больше собрано в источниках данных и чем быстрее происходят обновления, тем медленнее становится построение графиков. Параметр rollover, равный ColumnDataSource.stream(), сокращает общую длину собираемого материала, но в конечном итоге не предотвращает заикание.

Вероятно, в моем коде есть ошибка новичка, так как я считаю, что bokeh должно быть хорошо оборудовано для визуализации такого количества данных. Итак, вот что я делаю для черчения:

dashboard_source = ColumnDataSource(record[:1]) # initialize with first row
ecg_source = ColumnDataSource(record[:1]) # initialize with first row

# some options
time_window = 12 # seconds to keep in view
ecg_length = 1 # seconds to keep in view in ECG plot
update_rate = 1000 / sampling_rate # number of milliseconds between each plot update

# update function in which source data is fed from record dataframe
current_record_pos = 1
def update_dashboard_source():
    global current_record_pos
    new_row = record.iloc[current_record_pos]
    dashboard_source.stream(new_row, rollover = sampling_rate * time_window)
    ecg_source.stream(new_row, rollover = sampling_rate * ecg_length)
    current_record_pos += 1

def ecg_dashboard(doc):

    # dashboard element: ECG plot/s ---- ------- ---- ------- ---- ------- ---- -------

    ecg_plot = figure(width=800, height=400, title='ECG', x_axis_label='time in ms', y_range=(-1, 1.5))

    # plot ECG channels
    for record_channel, color in zip(record_channels, ['green', 'blue']):
        ecg_plot.line(source=ecg_source, x='time_ms', y=record_channel, alpha=.3, legend=record_channel+' ', color=color)

    # dashboard element: heart rate variability ---- ------- ---- ------- ---- ------- ---- -------

    hrv_plot = figure(width=400, height=400, title='heart rate variability', x_axis_label="r'r''", y_axis_label="r''r'''")
    hrv_plot.circle(source=dashboard_source, x='r_diff_1', y='r_diff_2', size=10, alpha=.23)

    # gather everything in a dashboard element and add it to the document
    ecg_row = row(ecg_plot)
    feature_row = row(hrv_plot)
    dashboard = column(ecg_row, feature_row)
    doc.add_root(dashboard)
    doc.add_periodic_callback(update_dashboard_source, update_rate)

show(ecg_dashboard)

Я не нашел руководство пользователя bokeh очень полезным в отношении обновленных графиков. Может быть, где-то есть коллекция лучших практик?

1 Ответ

0 голосов
/ 05 апреля 2019

Завершение беседы в комментариях: каждый раз, когда на график добавляется одна точка, вся область холста в браузере перерисовывается. Вот как работают браузеры. При sampling_rate из 250 получается 250 обновлений графика в секунду, то есть одно обновление за 4 мс. Это заставит браузер работать медленнее и медленнее, так как количество точек, которые будут отображаться (перерисовываться) каждые 4 мс, будет увеличиваться.

Я бы посоветовал увеличить период обновления с 4 мс до примерно 100 мс (возможно, с большими пакетами данных)

...