[尝试使用散景绘制TimeSlider映射时出现内存问题

问题描述 投票:0回答:1

我正在尝试使用Bokeh绘制TimeSlider地图,并且使用这些工具还很新。我正在使用Jupyter笔记本。

我需要提供GeoDataFrame列名称的列表作为绘图函数的参数。问题是,当我尝试在我的GeoDataFrame中添加所需的列时,我可以添加6列,然后计算机崩溃(尝试添加第7列时RAM瞬间上升)。我试图在Google Collab中运行我的笔记本,但是当在我的GeoDataFrame中添加第7列时,会话也会崩溃。我没有从Python得到任何错误,除了重启计算机之外,我无能为力。

[当我尝试仅用6年实现Slider时,该图是正确的,但我想涵盖50年,距离我还很远。

这是我的代码:

创建GeoDataFrame

df_states = gpd.read_file("countries.geo.json")                    # the GeoDataFrame
frames = {i:dat for i, dat in meat_production.groupby('Year')}     # getting the useful info from another dataset

years = range(1961, 2017)

for y in years:
    frames[y] = frames[y].drop('Year', axis=1)
    df_states = df_states.merge(frames[y], on="id")
    df_states = df_states.rename(columns={'Value': 'Meat %d'%y})

for循环非常适合第一次迭代,并给出我想要的结果。

绘制地图

slider_columns = ["Meat %d"%i for i in years]

df_states.plot_bokeh(
    figsize = (900,600),
    simplify_shapes=10000,
    slider = slider_columns,
    slider_range = years,
    slider_name = 'Year',
    colormap = 'Inferno',
    hovertool_columns = ['id']+slider_columns,
    title='Meat production'
)

还有另一种方法来定义plot_bokeh的参数吗?您知道如何处理此类问题吗?

提前感谢!

python-3.x memory bokeh jupyter-lab
1个回答
0
投票

plot_bokeh函数不是实际的Bokeh库的一部分。也许它是在Bokeh之上构建的其他一些单独的第三方库的一部分?无论如何,我将假定它创建独立的输出,而不是Bokeh服务器应用程序。在这种情况下,所有数据会被预先发送到浏览器。地理数据尤其会迅速爆炸。您尚未指定有关数据大小的任何详细信息,但作为一个假设示例:

50 yrs * 100 shapes/yr * 10k pt/shape * 2 coords/pt * 8 bytes/coord ~= 800 MB

这就是开始。那是原始的[[data-space坐标。所有这些坐标都必须转换为2倍的屏幕(即像素)坐标,因此现在您需要的是1.6GB。仍然没有完成。 Bokeh致力于提供高水平的交互性,因此会将所有数据放入省时的空间索引中(以支持悬停,Taptool等)。当前尚无选择(通过一项提议的功能添加一种方法),这是另一大内存成本,可以随着数据大小快速扩展。我们甚至没有提到可能还会发送任何每形状或每顶点属性数据。简而言之,通过此示例,您可以轻松地创建约3-6GB数据在浏览器中。那只是行不通的,在此级别之前,事情将开始崩溃。 我会说有几个选择:

    不发送实际形状数据。使用诸如Datashader和/或GeoViz之类的东西预渲染可以在Bokeh中显示的图像。这将大大减少浏览器中的数据大小
  • 创建Bokeh服务器应用程序。然后,浏览器只需要保存

  • 一次一次保存一年的数据
  • 。滑块的回调可以是一个真正的Python函数,该函数仅提取一年的数据,并更新绘图以仅使用该较小的数据集。

如果形状每年不变,那么您也可以(可能)仅发送形状的一个副本,而不是每年发送一次。至少可以肯定地用纯Bokeh代码实现。 (不确定在Bokeh上构建的库是什么)

© www.soinside.com 2019 - 2024. All rights reserved.