为了账号安全,请及时绑定邮箱和手机立即绑定

切片numpy数组时减少内存使用量

切片numpy数组时减少内存使用量

Smart猫小萌 2021-04-12 12:13:38
我在释放Python中的内存时遇到问题。情况基本上是这样的:我有一个大数据集,分为4个文件。每个文件包含5000个numpy形状数组(3072,412)的列表。我试图将每个数组的第10至20列提取到一个新列表中。我想要做的是依次读取每个文件,提取需要的数据,并释放我正在使用的内存,然后再继续下一个文件。但是,删除对象,将其设置为None并将其设置为0,然后再调用gc.collect()似乎无效。这是我正在使用的代码片段:num_files=4start=10end=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())这是几个文件后的输出:Working on file  0Memory 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  TrueMemory 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)如果我不放手,它将耗尽所有内存并触发MemoryError异常。有谁知道我该怎么做才能确保partial_db释放使用的数据?
查看完整描述

1 回答

?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

问题是这样的:


for x in partial_db:

    fields.append(x[:,start:end])

切片numpy数组的原因(与普通的Python列表不同)几乎不需要时间,也不会浪费空间,原因是它不会创建副本,而只是在数组内存中创建另一个视图。通常,那很棒。但是在这里,这意味着x即使在释放内存之后,您仍要保留内存x,因为您永远不会释放这些内存。


还可以采用其他方法,但是最简单的方法是仅附加切片的副本:


for x in partial_db:

    fields.append(x[:,start:end].copy())


查看完整回答
反对 回复 2021-04-16
  • 1 回答
  • 0 关注
  • 364 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信