首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >木星笔记本内存管理

木星笔记本内存管理
EN

Stack Overflow用户
提问于 2020-02-27 11:22:03
回答 1查看 4.2K关注 0票数 8

我目前正在kaggle的一个jupyter笔记本上工作。在对numpy数组执行所需的转换之后,我对其进行了腌制,以便将其存储在磁盘上。我这么做的原因是为了释放大数组占用的内存。

对数组进行酸洗后所消耗的内存约为8.7GB。

我决定运行@jan 这里提供的这个代码片段,以了解哪些变量占用了我的内存:

代码语言:javascript
复制
import sys

def sizeof_fmt(num, suffix='B'):
    ''' by Fred Cirera,  https://stackoverflow.com/a/1094933/1870254, modified'''
    for unit in ['','Ki','Mi','Gi','Ti','Pi','Ei','Zi']:
        if abs(num) < 1024.0:
            return "%3.1f %s%s" % (num, unit, suffix)
        num /= 1024.0
    return "%.1f %s%s" % (num, 'Yi', suffix)

for name, size in sorted(((name, sys.getsizeof(value)) for name, value in locals().items()),
                         key= lambda x: -x[1])[:10]:
    print("{:>30}: {:>8}".format(name, sizeof_fmt(size)))

执行此步骤后,我注意到我的数组的大小为3.3GB,所有其他变量之和在一起的大小约为0.1GB。

我决定删除该数组,并通过执行以下操作查看该数组是否解决了问题:

代码语言:javascript
复制
del my_array
gc.collect()

这样做后,内存消耗从8.7GB减少到5.4GB。这在理论上是有意义的,但仍然没有解释剩余的记忆被消耗了什么。

无论如何,我决定继续重新设置所有变量,看看这是否会释放内存:

代码语言:javascript
复制
%reset

正如预期的那样,它释放了上面函数中打印出来的变量的内存,我仍然保留了5.3GB的内存。

需要注意的一点是,在对文件本身进行腌制时,我注意到内存尖峰,因此对进程的总结如下所示:

  1. 对数组->内存消耗执行的操作从1.9GB增加到5.6GB
  2. ->文件的内存消耗从5.6GB增加到8.7GB
  3. 当文件被腌制到15.2 gb时,内存突然激增,然后下降到8.7GB。
  4. 删除的数组->内存消耗从8.7GB减少到5.4GB
  5. 执行重置->内存消耗从5.4GB降至5.3GB

请注意,以上内容是基于对kaggle上的内存进行监视的松散基础,可能是不准确的。我也检查过这个问题,但这对我的情况没有帮助。

这会被认为是内存泄漏吗?如果是的话,在这种情况下我该怎么办?

编辑1:

经过进一步的研究,我注意到其他面临着这个问题。此问题源于酸洗过程,而酸洗会在内存中创建一个副本,但由于某种原因,不会释放它。是否有方法在酸洗过程完成后释放内存。

编辑2:

当从磁盘中删除被腌制的文件时,使用:

代码语言:javascript
复制
!rm my_array 

它最终释放了磁盘空间,也释放了内存空间。我不知道上面的小贴士是否有用,但我还是决定把它包括进去,因为每一条信息都可能有帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-31 20:49:24

您应该注意到一个基本的缺点: CPython解释器实际上是实际上几乎不能释放内存并将其返回到操作系统。对于大多数工作负载,您可以假设在解释器进程的生存期内没有释放内存。然而,解释器可以在内部重用内存。因此,从操作系统的角度来看CPython进程的内存消耗确实毫无帮助。一个相当常见的工作是在子进程/工作流程中运行内存密集型作业(例如通过多处理 ),并“只”将结果返回给主进程。一旦工人死亡,内存实际上就被释放了。

其次,在sys.getsizeof上使用ndarray可能会令人印象深刻地产生误导。相反,使用ndarray.nbytes属性,并注意在处理视图时,这也可能会产生误导。

另外,我不太清楚你为什么要“腌制”数字数组。这份工作有更好的工具。举两个例子:h5py (基于HDF5的经典)和扎尔。这两个库都允许您直接在磁盘(和压缩)上使用ndarray-like对象--基本上消除了酸洗步骤。此外,扎尔还允许你内存中的-compatible数据结构。必须从ufunc的numpy,参与&朋友会很高兴地接受他们作为输入参数。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60432137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档