首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >减少分割numpy数组时的内存使用量

减少分割numpy数组时的内存使用量
EN

Stack Overflow用户
提问于 2018-05-06 00:25:46
回答 1查看 2.1K关注 0票数 3

我很难用Python释放内存。情况基本上是这样的:我有一个大的数据集分裂成4个文件。每个文件包含一个5000 numpy形状数组(3072,412)的列表。我试图把每个数组的第10列到第20列提取到一个新的列表中。

我想要做的是依次读取每个文件,提取我需要的数据,并在进入下一个文件之前释放我正在使用的内存。但是,删除对象、将其设置为None并将其设置为0,然后调用gc.collect()似乎不起作用。下面是我正在使用的代码片段:

代码语言:javascript
复制
num_files=4
start=10
end=20           
fields = []
for j in range(num_files):
    print("Working on file ", j)
    source_filename = base_filename + str(j) + ".pkl"
    print("Memory before: ", psutil.virtual_memory())
    partial_db = joblib.load(source_filename)
    print("GC tracking for partial_db is ",gc.is_tracked(partial_db))
    print("Memory after loading partial_db:",psutil.virtual_memory())
    for x in partial_db:
        fields.append(x[:,start:end])
    print("Memory after appending to fields: ",psutil.virtual_memory())
    print("GC Counts before del: ", gc.get_count())
    partial_db = None
    print("GC Counts after del: ", gc.get_count())
    gc.collect()
    print("GC Counts after collection: ", gc.get_count())
    print("Memory after freeing partial_db: ", psutil.virtual_memory())

下面是几个文件之后的输出:

代码语言:javascript
复制
Working on file  0
Memory before:  svmem(total=67509161984, available=66177449984,percent=2.0, used=846712832, free=33569669120, active=27423051776, inactive=5678043136, buffers=22843392, cached=33069936640, shared=15945728)
GC tracking for partial_db is  True
Memory after loading partial_db:  svmem(total=67509161984, available=40785944576, percent=39.6, used=26238181376, free=8014237696, active=54070542336, inactive=4540620800, buffers=22892544, cached=33233850368, shared=15945728)
Memory after appending to fields:  svmem(total=67509161984, available=40785944576, percent=39.6, used=26238181376, free=8014237696, active=54070542336, inactive=4540620800, buffers=22892544, cached=33233850368, shared=15945728)
GC Counts before del:  (0, 7, 3)
GC Counts after del:  (0, 7, 3)
GC Counts after collection:  (0, 0, 0)
Memory after freeing partial_db:  svmem(total=67509161984, available=40785944576, percent=39.6, used=26238181376, free=8014237696, active=54070542336, inactive=4540620800, buffers=22892544, cached=33233850368, shared=15945728)
Working on file  1
Memory before:  svmem(total=67509161984, available=40785944576, percent=39.6, used=26238181376, free=8014237696, active=54070542336, inactive=4540620800, buffers=22892544, cached=33233850368, shared=15945728)
GC tracking for partial_db is  True
Memory after loading partial_db:  svmem(total=67509161984, available=15378006016, percent=77.2, used=51626561536, free=265465856, active=62507155456, inactive=3761905664, buffers=10330112, cached=15606804480, shared=15945728)
Memory after appending to fields:  svmem(total=67509161984, available=15378006016, percent=77.2, used=51626561536, free=265465856, active=62507155456, inactive=3761905664, buffers=10330112, cached=15606804480, shared=15945728)
GC Counts before del:  (0, 4, 2)
GC Counts after del:  (0, 4, 2)
GC Counts after collection:  (0, 0, 0)
Memory after freeing partial_db:  svmem(total=67509161984, available=15378006016, percent=77.2, used=51626561536, free=265465856, active=62507155456, inactive=3761905664, buffers=10330112, cached=15606804480, shared=15945728)

如果我继续放它走,它将耗尽所有内存,并触发一个MemoryError异常。

有人知道我能做些什么来确保partial_db使用的数据被释放吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-06 00:50:39

问题是:

代码语言:javascript
复制
for x in partial_db:
    fields.append(x[:,start:end])

对numpy数组进行切片(与普通Python列表不同)几乎不需要时间,也不会浪费空间,原因是它没有复制,它只是在数组的内存中创建另一个视图。通常情况下,那很好。但是在这里,这意味着即使在释放了x本身之后,您仍将保持x的内存存活,因为您从未释放过这些切片。

还有其他方法可以解决这个问题,但最简单的方法是仅仅附加切片的副本:

代码语言:javascript
复制
for x in partial_db:
    fields.append(x[:,start:end].copy())
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50195197

复制
相关文章

相似问题

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