Python 2.7中的无内存泄漏OrderedDict替代方案?
我们正在检查其中一个包是否在Python gc中留下垃圾对象,并发现collections.OrderedDict对象不会被ref count机制删除,而是被放入gc中,在对它们进行批处理和稍微调整输出时使用以下引用:Python 2.7中的无内存泄漏OrderedDict替代方案?,python,garbage-collection,ordereddict,Python,Garbage Collection,Ordereddict,我们正在检查其中一个包是否在Python gc中留下垃圾对象,并发现collections.OrderedDict对象不会被ref count机制删除,而是被放入gc中,在对它们进行批处理和稍微调整输出时使用以下引用: <type 'list'> object at 0x10a876ab8: [ <Recursive reference to list object at 0x10a876ab8>, <Recursive reference to list ob
<type 'list'> object at 0x10a876ab8:
[ <Recursive reference to list object at 0x10a876ab8>,
<Recursive reference to list object at 0x10a876ab8>,
None]
这似乎与报告中的问题相同。这个问题在Python3.2中得到了修复,事实上,上面显示的引用周期出现在Python2.7中,但在Python3.7中没有
Python 2.7是否有collections.OrderedDict的无引用循环替代方案
更新:
我发现ordereddict.ordereddict也有相同的引用周期
我完全知道Python2.7已经不受支持了。尽管如此,我们仍然需要在Python2.7上支持我们的包
@Ramsha Siddiqui的答案指向Django的分类。我验证了在Django 1.7中,它的SortedDict没有引用循环。然而,至少在Django的1.11版中,SortedDict已从Django中删除
您可以对任何字典的项使用排序,如下所示:
odt = dict(sorted(dt.items()))
更新:保留原始顺序
如果您想保留原始顺序,也有一个Django图书馆:
from django.utils.datastructures import SortedDict
d2 = SortedDict()
如果这对你的案子有帮助,请告诉我
更新:[重复]参考:
这似乎是获得在参考周期中使用OrderedDicts的能力的解决方案。删除后,OrderedDict将无法立即释放其所有资源。您可以对任何字典的项目使用排序,如:
odt = dict(sorted(dt.items()))
更新:保留原始顺序
如果您想保留原始顺序,也有一个Django图书馆:
from django.utils.datastructures import SortedDict
d2 = SortedDict()
如果这对你的案子有帮助,请告诉我
更新:[重复]参考:
这似乎是获得在参考周期中使用OrderedDicts的能力的解决方案。您将无法让OrderedICT在删除后立即释放其所有资源。对项目进行排序与保留其原始顺序不同,OrderedICT就是这样做的。这是真的-我以前没有想到过这一点。我更新了答案。我尝试了你的建议使用django SortedAct,但它不再在我安装的django版本1.11中。From:SortedDisct在Django 1.7中被弃用,将在Django 1.9中删除。使用collections.OrderedICT代替。无论如何,谢谢你的帮助!哦,只是为了记录:根据我们的垃圾对象检查,来自Django 1.7的SortedDict没有引用循环!!对项目进行排序与保留其原始顺序不同,OrderedDict就是这样做的。这是真的——我以前没有想到过这一点。我更新了答案。我尝试了你的建议使用django SortedAct,但它不再在我安装的django版本1.11中。From:SortedDisct在Django 1.7中被弃用,将在Django 1.9中删除。使用collections.OrderedICT代替。无论如何,谢谢你的帮助!哦,只是为了记录:根据我们的垃圾对象检查,来自Django 1.7的SortedDict没有引用循环!!这回答了你的问题吗?这回答了你的问题吗?