Jupyter ノートブックで Folium と Bokeh を一緒に使用しています。私はデータフレームをループしており、行ごとに Folium マップにマーカーを挿入し、別のデータフレームからいくつかのデータを取得し、そのデータから Bokeh チャートを作成してから、Bokeh チャートを Folium マップ ポップアップに埋め込みます。 IFrame。コードは次のとおりです。
map = folium.Map(location=[36.710021, 35.086146],zoom_start=6)
for i in range (0,len(duty_station_totals)):
popup_table = station_dept_totals.loc[station_dept_totals['Duty Station'] == duty_station_totals.iloc[i,0]]
chart = Bar(popup_table,label=CatAttr(columns=['Department / Program'],sort=False),values='dept_totals',
title=duty_station_totals.iloc[i,0] + ' Staff',xlabel='Department / Program',ylabel='Staff',plot_width=350,plot_height=350)
hover = HoverTool(point_policy='follow_mouse')
hover.tooltips=[('Staff','@height'),('Department / Program','@{Department / Program}'),('Duty Station',duty_station_totals.iloc[i,0])]
chart.add_tools(hover)
html = file_html(chart, INLINE, "my plot")
iframe = folium.element.IFrame(html=html, width=400, height=400)
popup = folium.Popup(iframe, max_width=400)
marker = folium.CircleMarker(duty_station_totals.iloc[i,2],
radius=duty_station_totals.iloc[i,1] * 150,
color=duty_station_totals.iloc[i,3],
fill_color=duty_station_totals.iloc[i,3])
marker.add_to(map)
folium.Marker(duty_station_totals.iloc[i,2],icon=folium.Icon(color='black',icon_color=duty_station_totals.iloc[i,3]),popup=popup).add_to(map)
map
このループは非常にゆっくりと実行され、約を追加します。ループの実行ごとに、関連する python 3.5 プロセスのメモリ使用量に 200 MB ! 実際、ループを数回実行した後、私の MacBook 全体がクロールまで遅くなりました。マウスでさえ遅れています。関連するマップも、スクロールやズーム時に大幅に遅れ、ポップアップが開くのが遅くなります。明らかでない場合は、私はPython分析とWeb視覚化の世界にかなり慣れていないので、ここには明らかに非常に非効率的なものがあるかもしれません.
これがなぜなのか、地図のポップアップにボケチャートを表示させるより良い方法があるかどうか疑問に思っています. 私が行ったいくつかの基本的な実験から、問題はへの呼び出しにあるようには見えません.へのBar
呼び出しを含めるとメモリ使用量が本当に急増し、への呼び出しが追加さfile_html
れるにつれて悪化するようです. folium.element.IFrame
同じコードを再実行するとメモリ使用量が増加するため、何らかのメモリ リークが発生しているようです。
より効率的な方法で同じ効果 (Folium マーカーをクリックするとボケチャートが開く) を達成する方法について誰かがアイデアを持っている場合は、本当に感謝しています!
いくつかの実験に続いて更新
ループを段階的に実行し、この問題を引き起こしているコードの部分を特定するためにさらに多くの手順が追加されるにつれて、メモリ使用量の変化を観察しました。Bokeh 側では、最大の原因は への呼び出しにあるようです。file_html()
このステップでループを実行すると、実行ごとに関連する python 3.5 プロセスに約 5MB のメモリ使用量が追加されます (ループは 18 のチャートを作成します) bokeh.io.curdoc().clear()
。
ただし、より大きな問題は、Folium によって引き起こされているようです。Bokeh で生成された HTML を使用した Folium IFrame の作成と、IFrame にリンクされたマップ マーカーを含むループ全体を実行すると、実行ごとに Python プロセスのメモリ使用量が 25 ~ 30 MB 増加します。
したがって、これはより Folium に関する質問に変わっていると思います。なぜこの構造は非常にメモリ集約的で、より良い方法があるのでしょうか? ところで、結果の Folium マップを で HTML ファイルとして保存するとmap.save('map.html')
、22 MB の巨大な HTML ファイルが作成されます。