我不会发布很多代码,而是试着描述我遇到的问题。 我的程序正在输入一个元组列表:
input = [(a, b, c), (d, e, f, g)]
对于列表中的每个元组,我的函数f()
生成一个元组列表并将其转储到pickle文件中。此列表可以很小(1个元素)但也非常大(数千,数百万个元素)。我得到的更大的.pkl文件大约是9 Gb。
这一步可以像这样:
for elt in input:
f(elt)
函数f()
实际上调用了不同的方法/对象/函数,并且可以占用相当多的RAM。事实证明,我在RAM中只用了输入中的一些元素。我想跳过它们并在它发生时转到下一个(为了避免程序崩溃并在无法完成之后对其他输入进行计算)。
即:
for elt in input:
try:
f(elt)
except:
continue
我的问题是,我读到内存错误是非常讨厌的,并且无法始终从中恢复。
实施此尝试/除安全性的最佳方式是什么?
有没有办法在for
循环迭代之间清除内存?
编辑澄清:
还有一点。我在装有128 Gb RAM的PC上运行程序。但是,我没有只运行一次。我在input1上的一个线程中运行一次,在input2上的另一个线程中运行一次,依此类推。我有10个跑步。线程的组合在给定时刻在内存中加载太多。 但是,通过在某些线程(具有安全性)上进行下一次迭代,应该避免这种情况。
这种方法的主要资产(而不是减少线程数)是,如果我在具有8 Gb RAM的笔记本电脑上运行程序,只在一个线程中,它仍然可以工作。如果其中一个迭代需要的内存超过可用RAM(这将在具有8 Gb RAM的笔记本电脑上发生),它只是跳过它并转到下一个。
方法对我很直接,但我不知道如何在python上实现它,因为恢复内存错误并不安全。