Мне сложно преодолеть следующее:
Мне нужно визуализировать большой набор данных (> 1M строк, 3-5 столбцов) в боке DataTable. Извлечение всех данных стоит дорого (от mongodb занимает несколько минут - даже если они проиндексированы). Извлечение нескольких строк данных происходит очень быстро (так как коллекция mongodb проиндексирована)
Я решил реализовать пейджинг =>
(1) Настройте короткое боке с данными из 10 рядов
(2) Когда пользователь выбирает последнюю строку, обновите таблицу для просмотра следующей страницы (прочитайте следующие 10 строк) и переместите выделение в первую строку таблицы.
Первый шаг работает отлично. Тем не менее, я обнаружил, что реализация движущегося выделения лишь частично успешна. Подсветка изменена, но выбор не сделан, поэтому пользователь не может перейти к следующей странице с нажатой стрелкой вниз или клавишей PgDown. Может ли кто-нибудь помочь мне или решить проблему выбора, или посоветовать другому методу, как преодолеть проблему с представлением длинной таблицы с дорогостоящим поиском всех данных в боке?
Вот мой тестовый код:
from bokeh.plotting import figure, curdoc
from bokeh.models.sources import ColumnDataSource
from bokeh.layouts import row
from bokeh.models.widgets import DataTable, TableColumn
import random
table_rows_count = 10
def get_next_page():
data = list(range(get_next_page.zero_row_position, get_next_page.zero_row_position + table_rows_count))
ret = dict(index=data, x=data, y=data,z = random.sample(range(100), table_rows_count))
get_next_page.zero_row_position += table_rows_count
return ret
get_next_page.zero_row_position = 0
def data_table_selected(attr, old, new):
selected_row = new[0]
print(f'selected row: {selected_row} : {source1.selected.indices}')
if selected_row == table_rows_count-1:
source1.data = get_next_page()
source1.selected.indices = [0]
print(f'after update: selected row: {selected_row} : {source1.selected.indices}')
data = get_next_page()
source1 = ColumnDataSource(data)
fig1 = figure(plot_width=300, plot_height=300)
fig1.circle(x='x', y='y', size=table_rows_count, source=source1)
columns = [
TableColumn(field="y", title="XY"),
TableColumn(field="z", title="Text"),
]
data_table = DataTable(source=source1, columns=columns, width=400, height=280)
data_table.source.selected.on_change('indices', data_table_selected)
curdoc().add_root(row(fig1, data_table))