【问题标题】:Plotly figures in jupyter notebook take huge amounts of memoryjupyter notebook 中的绘图需要大量内存
【发布时间】:2018-03-03 01:27:21
【问题描述】:

我可能正在做一些非常愚蠢的事情,但我一直在使用我的 jupyter 笔记本中离线使用 plotly

import plotly.offline as py
py.init_notebook_mode(connected=True)
from plotly.graph_objs import *

我正在尝试显示一系列可以使用滑块导航的图像。包含图像数据的整个 numpy 数组是 50 个图像 x 64 宽 x 64 高。

我把它放到下面的滑块函数中,我从网上找到的代码拼凑而成。返回的 Figure 对象本身并不是很大。但是,当调用 plotly 的 iplot 时,我的 jupyter 笔记本在磁盘上的大小(由 ls -l 测量)非常大 - 像 15 MB,即使 numpy 源数据像 1MB。对于较大/多个数字,这变得难以管理。有谁知道怎么回事?

def slider_ims(imgs):

    imgs = np.flip(imgs,1) 

    data = [dict(
            type='heatmap',
            z = imgs[step,:,:],
            visible = False,
            showscale=False,
            xaxis="x",
            yaxis="y",
            name = 'z = '+str(step)) for step in np.arange(imgs.shape[0])]
    data[0]['visible'] = True


    steps = []
    for i in range(len(data)):
        step = dict(
            method = 'restyle',
            args = ['visible', [False] * len(data)],
            label = str(i)
        )
        step['args'][1][i] = True # Toggle i'th trace to "visible"
        steps.append(step)

    sliders = [dict(
        active = 0,
        currentvalue = {"prefix": "Frame: "},
        pad = {"t": 50},
        steps = steps,
        ticklen = 0,
        minorticklen = 0
    )]

    layout = Layout(
             sliders = sliders,
             font=Font(family='Balto'),
             width=800,
             height=600,
            )


    fig=Figure(data=data, layout=layout)
    py.iplot(fig)
    return fig

【问题讨论】:

    标签: python memory plotly jupyter


    【解决方案1】:

    您想要更小的 ipynb 文件吗?不要存储输出单元格。

    如果您只关心笔记本的磁盘大小,则可以更改 Jupyter 配置以禁用将输出单元格写入 ipynb 文件。这意味着只有您的代码保存在磁盘上。每当您打开笔记本时,输出单元格将为空,您需要重新运行笔记本才能获取它们。您必须决定这是否适合您使用笔记本的方式。

    您可以通过编辑您的 jupyter_notebook_config.py 配置文件来进行设置,该文件通常位于您的主目录中的 ~/.jupyter 下(Windows:C:\Users\USERNAME\.jupyter\)。如果它还不存在,这个文件可以从带有jupyter notebook --generate-config的终端生成(更多信息here)。

    在此配置文件中,您需要添加一个 pre-save 钩子,在保存之前剥离输出单元格,如documentation 中所述:

    def scrub_output_pre_save(model, **kwargs):
        """scrub output before saving notebooks"""
        # only run on notebooks
        if model['type'] != 'notebook':
            return
        # only run on nbformat v4
        if model['content']['nbformat'] != 4:
            return
    
        for cell in model['content']['cells']:
            if cell['cell_type'] != 'code':
                continue
            cell['outputs'] = []
            cell['execution_count'] = None
    
    c.FileContentsManager.pre_save_hook = scrub_output_pre_save
    

    额外好处:像这样剥离输出单元格也是获得可读差异以进行源代码控制的好方法,例如git.

    【讨论】:

      【解决方案2】:

      通常,plotly 的情节很大。您的笔记本大小增加了,因为您使用内联绘图 (py.iplot) 将绘图保存在笔记本上。
      如果您不希望笔记本太大,只需使用普通绘图 (py.plot) 并将绘图保存在另一个文件中。
      你可以阅读 plotly 的文档

      【讨论】:

        【解决方案3】:

        就我而言,我使用如下

        import plotly.offline as pyo
        
        pyo.plot(fig, filename="example.html")
        

        将图像保存为不同的页面。

        【讨论】:

          猜你喜欢
          • 2016-08-05
          • 2018-01-10
          • 2021-07-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-22
          • 2018-08-25
          • 2021-11-15
          相关资源
          最近更新 更多