Folium + Bokeh:性能不佳和大量内存使用

时间:2016-08-24 14:12:08

标签: python-3.x jupyter-notebook bokeh folium

我在Jupyter笔记本中一起使用Folium和Bokeh。我循环遍历数据框,并在Folium地图上插入标记的每一行,从单独的数据框中提取一些数据,从该数据中创建一个散景图,然后将散景图嵌入到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

此循环运行非常缓慢,并添加约。每次运行循环时200mb到相关python 3.5进程的内存使用量!事实上,在运行循环几次后,我的整个macbook正在慢慢爬行 - 即使鼠标也是滞后的。滚动和缩放时,关联的地图也会严重滞后,弹出窗口打开速度很慢。如果不是很明显,我对python分析和Web可视化世界都很陌生,所以也许这里有一些非常低效的东西。

我想知道为什么会这样,如果有更好的方法让Bokeh图表出现在地图弹出窗口中。从我已经完成的一些基本实验来看,问题似乎不是调用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-30mb。

所以,我想这更多地转向了Folium问题。为什么这个结构如此内存密集,是否有更好的方法?顺便说一下,将生成的Folium地图保存为带有map.save('map.html')的HTML文件会创建一个巨大的22mb HTML文件。

1 个答案:

答案 0 :(得分:1)

有许多不同的用例,其中一些用于不可避免的权衡。为了使其他一些用例变得非常简单和方便,Bokeh有一个隐含的“当前文档”,并在那里积累东西。对于在循环中顺序生成一组图的特定用例,您需要在每个图之间调用bokeh.io.reset_output()以防止这种累积。