我在 Python 中使用 networkx(OpenSuse 12.3 上的 2.7.3)来分析一些大图。在分解我的大网络(9800 个节点,6273292 个边)然后运行 networkxconnected_components_subgraph(GRAPH)
函数之后,Python 不再通过调用 shell os.system()
(我还没有测试过其他 shell 通信技术subprocess
)。
该函数本身运行顺利,我得到分解图,然后我可以毫无问题地操作。
请参阅下面的代码示例
# this function is just included for completeness, but runs fine
# -------------------------------------------------------------------------
import networkx as nx
import os
def build_network(filename):
with open(filename) as f:
content = f.readlines()
GRAPH=nx.Graph()
for connection in content:
GRAPH.add_edge(connection.split("\t")[0], connection.split("\t")[1][:-1])
return GRAPH
#--------------------------------------------------------------------------
## CODE FROM HERE
GRAPH = build_network("mtrx_large.abc")
os.system("ls") # runs fine
subgraphs = nx.connected_component_subgraphs(GRAPH)
os.system("ls") # gives a -1 error - no os.system(<>) commands can run now
我完全被难住了,这引发了一个非常重要的障碍。此行为发生在标准 Python 解释器中ipython
并通过标准 Python 解释器发生。在 ipython 中ls
直接运行现在什么都不返回,但如果我使用cd
它实际上可以自动完成目录。
更新
这种行为在我的 Ubuntu 机器 (12.04) 上无法重现,因此似乎特定于 OpenSuse 或(更有可能)我的工作站。我的 Ubuntu 机器只有 8GB 的 RAM,这意味着在加载图表并执行连接的子组件操作后,只有 700MB 是空闲的,这让我认为这可能不是 OpenSuse 机器上的(直接)内存问题。
更新 2
所以我实际上只是在我的 Ubuntu 机器上重现了它,这很奇怪,但现在我无法再次重现它,即使在遇到内存错误之后也是如此。如果有人想尝试,可以在这里找到矩阵文件(72MB)——我建议使用Save as...
. 只需运行cd
到其中包含此文件的目录并执行我在上面粘贴的代码。您需要networkx
安装(显然)。
更新 3
重新启动我的 OpenSuse 系统并运行后,ssh
我能够成功运行代码。仍然不确定问题可能是什么 - 也许与重新启动之前我有大约 1GB 已用交换空间的事实有关?
更新 4
结果表明交换问题似乎无关紧要(即使没有使用交换空间也可以重现错误)。这很烦人 - 目前只有重新启动有帮助。