我试图迭代遍历100,000张图片,并捕获一些图像特征并将结果数据框存储为pickle文件。不幸的是,由于RAM限制,我被迫将图像分成20,000个块,并在保存结果到磁盘之前对它们执行操作。下面编写的代码应该在开始处理下一个20,000个图像之前保存结果的数据帧。然而,这似乎没有解决我的问题,因为内存没有在第一个for循环结束时释放。因此,在处理第50,000条记录时,程序由于内存错误而崩溃。我尝试在保存对象到磁盘后删除它们并调用垃圾收集器,但是RAM使用情况似乎没有下降。我错过了什么?
#file_list_1 contains 100,000 images
file_list_chunks = list(divide_chunks(file_list_1,20000))
for count,f in enumerate(file_list_chunks):
# make the Pool of workers
pool = ThreadPool(64)
results = pool.map(get_image_features,f)
# close the pool and wait for the work to finish
list_a, list_b = zip(*results)
df = pd.DataFrame({'filename':list_a,'image_features':list_b})
df.to_pickle("PATH_TO_FILE"+str(count)+".pickle")
del list_a
del list_b
del df
gc.collect()
pool.close()
pool.join()
print("pool closed")
proc.get_memory_info()
来比较GC之前和之后的内存使用情况。您可能也会无意中破坏堆,而Python GC可能会或可能不会为您进行碎片整理(即使您“删除并收集”那些死对象,也会导致内存使用量增加)。 - cronburgglobals()
中前10个最大的对象来进行“剖析”:var_sizes = {}; for var_name, var_value in globals().items(): var_sizes[var_name] = sys.getsizeof(var_value); [print(f"{var_name}: {size}") for (var_name, size) in sorted(var_sizes.items(), key=lambda k_v: k_v[1])[:10]]
。但对于列表/字典/容器,您还应该添加存储项的大小(请参见https://dev59.com/9HRB5IYBdhLWcg3w-789#30316760了解详情)。 - imposeren