【发布时间】:2011-03-05 21:17:18
【问题描述】:
我意识到答案很可能是否定的!
基本上,我有一个图形(节点和边类型),它代表一个正方形网格;每个节点对象包含对该节点具有边缘的每个其他节点的引用,这似乎意味着当使用 cPickle.dump 序列化图形时,它会以深度优先方式遍历图形中的每个节点,这意味着对于一个井- 表示 16x16 网格的连接图,它有效地将其视为 256 级深度的数据结构。这意味着较大的网格很快就会超过默认的最大 Python 递归深度,特别是因为实验表明,似乎需要在堆栈上进行大约 4 次调用才能将数据结构额外一层。
问题是,我还有一个 dict-of-dicts 引用该图的方式允许我使用笛卡尔坐标来查找特定节点(例如“node = nodes[3][6]” )。所以从概念上讲,它根本不是一个高度嵌套的数据结构,它是一个相当平坦的结构,恰好有很多横向引用,但似乎 cPickle 完全是深度优先的(我理解这是迄今为止最简单的方法工作)。
现在,我知道了 sys.setrecursionlimit(),并且我已经做了一些实验来找出我需要为什么大小的图形设置限制,所以这是“最简单”的选项。我知道我可以退出节点到节点的链接并依靠dict-of-dicts来维护网格和单独的平面结构来维护边缘权重,但是有各种原因我想避免那 - 尤其是节点到节点的链接允许更直观地使用数据结构。我相信从我所读到的内容中,我应该能够提供我自己的 __getstate__ 和 __setstate__ 实现并覆盖酸洗功能,但显然这是一项非常重要的工作。如果有办法让 cPickle(或 pickle,我不挑剔!)使用广度优先遍历,它应该可以很简单地解决问题!
【问题讨论】: