我写了一个Python程序,它作用于一个大的输入文件,创建了几百万个表示三角形的对象.算法是:
在打印三角形之前打印出完整的顶点列表的OFF的要求意味着在将输出写入文件之前我必须在内存中保存三角形列表.与此同时,由于列表的大小,我遇到了内存错误.
告诉Python我不再需要某些数据的最佳方法是什么,它可以被释放?
我在Python中有一个相对较大的字典,并希望不仅能够从中删除项目,而且实际上从我的程序中的这些删除中回收内存.我正在遇到一个问题,虽然我从字典中删除项目甚至手动运行垃圾收集器,但Python似乎并没有释放内存本身.
一个简单的例子:
>>> tupdict = {}
# consumes around 2 GB of memory
>>> for i in xrange(12500000):
... tupdict[i] = (i,i)
...
# delete over half the entries, no drop in consumed memory
>>> for i in xrange(7500000):
... del tupdict[i]
...
>>> import gc
# manually garbage collect, still no drop in consumed memory after this
>>> gc.collect()
0
>>>
Run Code Online (Sandbox Code Playgroud)
我想现在发生的事情是,尽管条目被删除并且垃圾收集器运行,但Python不会继续并调整字典大小.我的问题是,有没有简单的方法,或者我可能需要更严肃地重新考虑我如何编写我的程序?
作为这个问题的后续,我试图绕过range(int(1e8))使用生成器的例子列表xrange(int(1e8)).其中xrange只是一个产生长序列值的过程的例子.(请假设它不能轻易复制.)还有一些背景知识,我有一长串的时间戳/值对,我想对它进行一些处理(有时间序列).我试图避免将这些内容整体记录到内存中,因为这是很多数据.
我认为如果我可以将多个处理单元同时应用于我的生成器生成的数据流,那将会很酷.第一个想法是使用itertools.tee(),例如:
from itertools import tee
g1,g2 = tee(xrange(int(1e8)),2)
sum(g1), sum(g2)
Run Code Online (Sandbox Code Playgroud)
但后来我发现只有第一个sum()会使用生成器,而tee()内部list再次构建一个(我想避免它).
所以我想,我需要一个异步解决方案,即允许每个sum()都在每个生成器步骤进行更新的解决方案.想到的东西在哪里
但是我之前没有真正使用过,部分我甚至无法判断这些方法是否有效,或者是有效/高效/高效的.
从这一点来说,我很乐意感谢观众的任何建议!
更新
我想避免使用基于回调的解决方案,因为它显着地降低了性能(这是它当前实现的方式).我在下面添加了一些分析(如果测试不客观,请添加注释):
class SinkA:
def __init__(self, src):
for i in src: pass
class SinkB:
def f(self,i):
pass
class Source:
def __iter__(self):
for i in xrange(int(1e4)):
yield i
def t1():
src = Source()
snk = SinkA(src)
def t2():
src = Source()
snk = …Run Code Online (Sandbox Code Playgroud) 例如,我有以下Python代码:
>>> x = 9.89
Run Code Online (Sandbox Code Playgroud)
现在,我知道类型将在运行时动态确定为浮动,但是我不确定如何分配内存。确定类型后,是否会动态分配用于float大小的内存?分配的内存量是否总是相同?