<p>我将发布为外部存储设置NetworkX的细微差别。Kikohs指出每一本字典都有工厂,这是正确的。这些可以被覆盖。在</p>
<p>对于持久化存储,真正需要特别注意的字典是节点字典。在</p>
<p>必须特别注意dict类实现的行为。NetworkX类中有一些代码可以更改内存中从字典返回的值,而无需将其设置回原处。在</p>
<p>例如:</p>
<pre><code>self.succ[u][v]=datadict
self.pred[v][u]=datadict
</code></pre>
<p>这些值不会保留回存储后端。为了适应这种情况,我使用了一个内存缓存,它将对象保存在内存中,当对象被逐出时,它会将它们写入底层存储。在</p>
<p>对于我使用的内存缓存<code>cachetools</code>。有关逐出,请参见:<a href="https://stackoverflow.com/questions/29470958/python-functools-lru-cache-eviction-callback-or-equivalent">Python functools.lru_cache eviction callback or equivalent</a></p>
<p>对于底层存储,我使用了<code>plyvel</code>(<a href="https://plyvel.readthedocs.org/en/latest/" rel="nofollow noreferrer">https://plyvel.readthedocs.org/en/latest/</a>),这是LevelDB的Python接口。在</p>
<p>下面我还给出了字典的实现。注意,代码中仍然存在错误和bug,并且还没有经过正确的测试,但是您已经了解了基本的概念。在</p>
^{pr2}$
<p>图形类:</p>
<pre><code>class PersistedGraph(nx.Graph):
def __init__(self, data=None, node_dict_factory=None, adjlist_dict_factory=None, edge_attr_dict_factory=None,
**attr):
if node_dict_factory:
self.node_dict_factory = node_dict_factory
if adjlist_dict_factory:
self.adjlist_dict_factory = adjlist_dict_factory
if edge_attr_dict_factory:
self.edge_attr_dict_factory = edge_attr_dict_factory
nx.Graph.__init__(self, data, **attr)
</code></pre>