Python/Jupyter笔记本中的内存泄漏

2024-09-27 00:20:07 发布

您现在位置:Python中文网/ 问答频道 /正文

通过在单个Jupyter笔记本单元中运行以下代码,我将1GB的文件加载到函数的内存中,并在函数定义后返回结果:

import pickle

def fun():
    with open('./data/input/train_test_clevr_pkls/train_clevr_1000.pkl', 'rb') as handle:
        return pickle.load(handle)

fun()

然后,Jupyter笔记本将打印函数的输出。从我运行单元后消耗的内存来看,它的存储容量达到了预期的1GB。但是,如果我多次运行同一个单元,每次内存占用都会增加1GB,直到我的整个RAM被消耗,然后我的Windows操作系统使用页面文件交换来处理标记为被消耗的更多内存,这会破坏我的应用程序的性能。我已经尝试使用gc.collect()来释放内存,但是没有用

我看到有人问我类似的问题,但我没有找到问题的答案。内存是而不是被内部重用,它只会增长


Tags: 文件函数内存代码import定义笔记本jupyter
1条回答
网友
1楼 · 发布于 2024-09-27 00:20:07

您之所以看到这一点,是因为Jupyter存储了对名为Out的名称的所有引用

MRE(所有这些都在一个单元中)

from itertools import product

def foo():
    return [*product(range(5), repeat=5)]

[foo() for _ in range(5)]

在单元格中运行此命令时,Jupyter会将其保存到dictOut

Out的部分内容

{1: [[(0, 0, 0, 0, 0),
   (0, 0, 0, 0, 1),
   (0, 0, 0, 0, 2),
   (0, 0, 0, 0, 3),
   (0, 0, 0, 0, 4),
   (0, 0, 0, 1, 0),
   (0, 0, 0, 1, 1),
   (0, 0, 0, 1, 2),
   (0, 0, 0, 1, 3),
   (0, 0, 0, 1, 4),
   (0, 0, 0, 2, 0),
   (0, 0, 0, 2, 1),...}

当您再次运行代码块时,它将该值存储到Out中的新键3。每次运行单元格时,都会不断向Outdict添加新的键值对

现在,当您执行print(...)时,为什么它不会发生

from itertools import product

def foo():
    return [*product(range(5), repeat=5)]

print([foo() for _ in range(5)])

在这种情况下,Jupyter不会将结果保存到Outdict。无论您运行该单元格多少次,Outdict将始终是{}

相关问题 更多 >

    热门问题