在python中存储大型但可预测的数据

时间:2018-06-20 19:04:36

标签: python python-3.x memory data-structures

我正在编写的程序需要一棵拥有超过200万片叶子的搜索树。在我的第一个实现中,每个叶子和节点都是指向其子对象的对象。内存需求相当大,约为GB的一半。由于多线程进程中的每个进程都需要自己的副本,因此这尤其成问题。有问题的程序有时在18核计算机上运行,​​并且将9GB的RAM专用于搜索树是不可接受的。

此数据遵循重复数百万次的刚性模式,因此不需要灵活性。如果这是C或C ++,则明确的解决方案是为每个节点/叶子使用一个结构,并具有该结构的单个大型数组。我在针对此问题的python中找到合适的数据类型时遇到麻烦。将数据存储为元组列表或元组的列表并不能像希望的那样缓解该问题。我使用了打字包的命名元组功能,在我的测试用例中,它似乎丝毫没有减少内存需求。

我当前的解决方案是使用整数数组,节点通过数组中的索引指向其子节点,并且通过将小数点移位将一个浮点值转换为int。在这种特殊情况下,这是可能的,并且显着减少了内存使用,但是需要在表示之间来回转换数据,并且需要代码具有很多重复。但是,在其他用例中,我可能需要类似的结构来包含浮点数据或指向其他数据类型。在Python中执行此操作的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

您可以尝试使用structclass而不是namedtuple。每个structclass实例在内存中比namedtuple少4 * 8字节。 structclass不使用循环垃圾收集,并且不包含__dict__,因此可以减少内存使用。