Python Networkx:在将网络保存/序列化为hardisk

时间:2016-08-10 18:22:37

标签: python serialization pickle networkx gml

我在Python中使用networkx1.10来处理一个项目,该项目需要将网络转储到硬盘上,然后重新加载它们以继续执行某些操作此类网络的算法。

我一直在尝试用几种不同的方式:首先使用nx.write_gml()和nx_read_gml(),现在使用pickle / cpickle。

虽然表面上看起来一切正常,但我注意到在模拟中我得到的结果是否在某个时间点发生了保存/加载。

我认为这可能与某些网络似乎被转储/重新加载程序(当然是意外的)修改的事实有关。

对于调试,现在我正在使用pickle保存并重新加载每个网络,比较转储/重新加载之前和之后的gml表示(使用nx.write_gml / nx.generate_gml实现)。这样做,我注意到了一些差异。

在某些情况下,它只是某些图形属性的顺序被修改,导致我的程序没有任何损害。在其他情况下,gml表示中出现两条边的顺序是不同的,同样没有坏处。

但是,通常会修改某些节点的ID,如下例所示:

https://www.diffchecker.com/zvzxrshy

尽管边缘似乎相应地被修改,以使网络看起来是等效的,但ID中的这种改变可以改变我的模拟(出于我不打算解释的原因)。

我相信这可能是我问题的根源。

你知道为什么会发生这种情况,即使使用像pickle / cpickle那样的低级序列化机制吗?

如何在序列化程序之前和之后确保网络完全相同?

我正在做这样的事情:

with open('my_network.pickle', 'wb') as handle:
    pickle.dump(my_network, handle, protocol=pickle.HIGHEST_PROTOCOL)
...
with open('my_network.pickle', 'rb') as handle:
    my_network_reloaded = pickle.load(handle)

# compare nx.write_gml for my_network and my_network_reloaded

任何帮助都将受到高度赞赏:过去三天我一直在与这个问题作斗争,我疯了!

谢谢

1 个答案:

答案 0 :(得分:1)

它们似乎是相同的图形,直到同构。

您的问题可能是节点订单。实际上,networkx使用dicts来存储节点和边缘,这些节点和边缘是无序的和随机的。

您有两种解决方案:要么忽略它,要么使用有序图:

$scope.caller = function(onFinal) {
    $http({...}).then(successCallback(response) {
        ...
        onFinal();
    }, function errorCallback(response) {
        ...
        onFinal();
    });
}

(来自the documentation of the Graph class的例子)