Спасибо за публикацию блока, который облегчает тестирование.
Я смоделировал намного больше точек, сгенерировав 200 строк для каждой из ваших ~ 46 тыс. Строк. Я видел только небольшое заикание при 100x ~ 23k строках (iMac 2017 с большим количеством оперативной памяти).
Известно, что Leaflet.markercluster работает медленнее с более чем 10K точками . С 46k строками Leaflet.markercluster потребовалось около 475 мсек, чтобы очистить и добавить слои Leaflet:
Поскольку в JavaScript есть только один поток (если тольковы используете рабочих), D3 должен получать тайм-ауты (на самом деле requestAnimationFrame
) каждые 16 мс или около того, чтобы создать плавную анимацию.
Один из способов - отложить карту, перерисовывающую 500 мс, пока другие не закончили:
dc.override(mapChart, 'redraw', function() {
window.setTimeout(() => mapChart._redraw(), 500);
});
Вилка вашего блока с обходным решением .
Конечно, это также заставляет карту перерисовываться на 500 мс дольше. И если вы щелкнете достаточно быстро, последняя перерисовка карты все еще будет выполняться, когда она будет пытаться нарисовать диаграммы.
Вы также можете попробовать опцию chunked addLayers , но я думаю, что у вас будетустановить chunkedInterval настолько низким, чтобы он также замедлял markerclusters.
Эффективная обработка этого большого количества данных возможна в JavaScript - очевидно, у crossfilter нет проблем. Я не знаю, является ли алгоритм уединения слишком дорогим. Кто-то в этом вопросе предложил предварительно объединить баллы, но я думаю, это будет означать, что вы не сможете увидеть отдельные баллы.