Использование памяти Densitymapbox большого набора данных Plotly / Dash

#python #plotly #plotly-dash

#python #plotly #plotly-dash

Вопрос:

У меня есть набор данных с миллионами точек широты / долготы, которые мы строим с высоким разрешением, используя plotly-dash Densitymapbox :

 data = pandas.DataFrame()
# ...
go.Densitymapbox(
    lat=data['Latitude'],
    lon=data['Longitude'],
    z=data['Count'],
    hoverinfo='skip',
    # ...
)
 

Согласно Mapbox, их библиотека должна поддерживать миллионы точек без проблем, как показано в их демонстрации @ https://demos.mapbox.com/100mpoints /

Когда я пытаюсь это сделать, кажется, что Mapbox способен обрабатывать запросы. Однако в моей реализации с plotly / dash, в отличие от демонстрации выше, браузер оказывается под водой. Первая загрузка работает нормально (хотя и использует много памяти), но при перезагрузке данных происходит сбой Chrome, а Firefox сообщает об ошибке нехватки памяти на консоль и не обновляет тепловую карту.

Набор данных, который я использую, составляет 1093737 точек. Выполняя математические вычисления на обратной стороне салфетки, это должно быть только <~ 25 МБ данных (1093737 * (8 8 8)) для 2 значений с плавающей запятой двойной точности и 1 (64-битного) целого числа, и объем данных, отправляемых в браузер, показывает это. Однако процесс браузера увеличивает объем памяти до 3,5 ГБ, а затем при последующих перезагрузках кажется, что браузеру не хватает памяти.

Есть ли какие-либо средства в dash / plotly, чтобы предотвратить отключение браузера? Мне не нужно взаимодействовать с точками графика плотности, и я установил hoverinfo='skip' , чтобы указать это, но хотел бы сохранить интерактивность тепловой карты, пересчитывающей наложение при изменении масштаба карты. Я изучаю другие альтернативы, такие как растрирование на стороне сервера тепловой datashader карты, но это приведет к удалению этой интерактивности, которую я хотел бы сохранить.

Комментарии:

1. Привет @clcto ! Я сталкиваюсь с той же проблемой. Нашли ли вы какое-нибудь решение своей проблемы?

Ответ №1:

LensPy был создан именно для решения этой проблемы. Он построен поверх Plotly Dash, чтобы позволить вам отображать очень большие наборы данных, сохраняя при этом плавную интерактивность. Вот пример того, как вы можете добиться этого с помощью Mapbox.

 import pandas as pd
import plotly.express as px
from lenspy import DynamicPlot

df = pd.read_csv(
    'https://raw.githubusercontent.com/plotly/datasets/master/earthquakes-23k.csv')
fig = px.density_mapbox(df,
                        lat='Latitude', lon='Longitude',
                        z='Magnitude',
                        radius=10,
                        center=dict(lat=0, lon=180),
                        zoom=0,
                        mapbox_style="stamen-terrain")

plot = DynamicPlot(fig)
plot.show()
 

Отказ от ответственности: я создатель LensPy.

Комментарии:

1. Спасибо, я посмотрю поближе, но, похоже, это не Densitymapbox поддерживается. Кроме того, как бы я использовал DynamicPlot в существующем приложении dash? Это все на стороне клиента или мне придется перезагружать свои данные каждый раз, когда изменяется масштаб?

2. Я обновил свой ответ, чтобы показать пример с Densitymapbox, который теперь официально поддерживается. Я также расширил документацию здесь, чтобы показать, как вы могли бы использовать это в своем собственном приложении Dash. lenspy.readthedocs.io/en/latest/… Это следует модели клиент <> сервер. Причина, по которой большие графики приводят к сбою вашего браузера, заключается в том, что вы отображаете весь css и html в своем браузере. 32-битное значение легко утроится в размере, когда оно отображается в браузере из-за html / css, из которых состоит ваш график.

3. Есть ли R блестящий эквивалент этого?

4. Это lenspy полная ерунда. Не делает ничего, кроме понижающей дискретизации, и может вызвать проблемы. Потратил впустую свое время 🙁

5. Мне жаль слышать, что это был ваш опыт. Мы работаем над возрождением и перестройкой этого проекта, поскольку изначально ожидалось больше пользователей и вариантов использования (этот проект превосходит мои ожидания относительно того, насколько он будет популярен). Лучший способ поддержки — сообщить о своих отзывах / проблемах на нашем GitHub. Спасибо, что попробовали, и я надеюсь, что мы сможем повлиять на ваше мнение. github.com/telemetrydb/lenspy/issues