我正在从面向对象的数据库中读取一组对象(表,如 sqlite3 表或数据帧),其中大部分都足够小,Python 垃圾收集器可以毫无意外地处理。但是,当它们变得更大(小于 10 MB)时,GC 似乎无法跟上。
伪代码如下所示:
walk = walkgenerator('/path')
objs = objgenerator(walk)
with db.transaction(bundle=True, maxSize=10000, maxParts=10):
oldobj = None
oldtable = None
for obj in objs:
currenttable = obj.table
if oldtable and oldtable in currenttable:
db.delete(oldobj.path)
del oldtable
oldtable = currenttable
del oldobj
oldobj = obj
if not count % 100:
gc.collect()
我正在寻找一种优雅的方式来管理内存,同时允许 Python 在可能的情况下处理它。
也许令人尴尬的是,我尝试使用 del 来帮助清理引用计数。
我已经在我的 for 循环中以不同的模数尝试了 gc.collect():
- 100(无差异),
- 1(大大减慢循环,我仍然会收到某种类型的内存错误),
- 3(循环仍然很慢,但内存最终还是会爆炸)
建议表示赞赏!!!
特别是,如果你能给我一些工具来帮助自省。我在这里使用过 Windows 任务管理器,它似乎或多或少地随机出现内存泄漏。我尽可能地限制了交易规模,这似乎有点帮助。