Python 内存优化以生成大于RAM的数据
假设我想生成一个范围的笛卡尔积,即:Python 内存优化以生成大于RAM的数据,python,python-3.x,pandas,optimization,itertools,Python,Python 3.x,Pandas,Optimization,Itertools,假设我想生成一个范围的笛卡尔积,即: from itertools import product var_range = range(-10000, 10000) vars = list(product(var_range, repeat=2)) var[:10] 因此,输出如下所示: [(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (0, 6), (0, 7), (0, 8), (0, 9)] 然而,这似乎对mu RAM和
from itertools import product
var_range = range(-10000, 10000)
vars = list(product(var_range, repeat=2))
var[:10]
因此,输出如下所示:
[(0, 0),
(0, 1),
(0, 2),
(0, 3),
(0, 4),
(0, 5),
(0, 6),
(0, 7),
(0, 8),
(0, 9)]
然而,这似乎对mu RAM和我的IPython(12GB RAM)崩溃有很大影响
我在考虑将范围划分为批,并在四个循环迭代中使用它:
[10000,-5000],-4999,0],[15000],[500110000]
然后,在每次迭代之后,我可以将其作为数据帧保存到h5文件中,然后附加到上一次迭代的结果中
我还阅读了python中的生成器
- 如果是这样,那么在这种情况下,发电机如何带来优化李>
- 优化如此简单的案例,哪一种方式最适合
from itertools import product
var_range = range(-10000, 10000)
vars = product(var_range, repeat=2)
print([next(vars) for _ in range(10)])
将非
列表
类型转换为列表
需要很长的时间,尤其是对于这个长序列,您可以只使用它的一部分,前十个元素,然后它应该可以工作,就像您使用列表(…)
一样,它处理整个对象,而下一个
十次则不行。产品(var_range,repeat=2)
已经是一个迭代器。只是不要将它放入列表中。我会使用numpy
进行此类操作。@juanpa.arrivillaga好的,您建议如何将其直接移动到h5,然后分批移动?(因为我假设这是您的想法)@sardok你能为你的意思提供代码吗?好的,这只生成10个元素。所以基本上要覆盖整个范围,我必须把它放在一个循环中。我需要把所有生成的值放在一个文件中。所以我们回到循环中,最后一行作为循环的主体。有没有其他非循环的方法来保存整个循环使用此生成器将范围扩展到一个文件?我的意思是目标是这里的10k x10k元组。@mCs很好,让它更清楚,你表明你想要前10个元组,我给了你解决方案。是的,因为10比10k更容易显示;)我赞成你的答案。