Python (OpenSuse 12.3 では 2.7.3) で networkx を使用して、いくつかの大きなグラフを分析しています。私の大きなネットワーク (9800 ノード、6273292 エッジ) を分解してから、networkxconnected_components_subgraph(GRAPH)
関数を実行した後、Python はシェルを介して呼び出すことができなくなりましたos.system()
(他のシェル通信技術は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
私は完全に困惑しており、これはかなり重大な障害となります。この動作はipython
、標準の Python インタープリターと両方で発生します。ipython ではls
、直接実行すると何も返されませんが、使用するcd
と実際にディレクトリをオートコンプリートできます。
アップデート
この動作は私の Ubuntu ボックス (12.04) では再現できないため、OpenSuse または (より可能性が高い) 私のワークステーションのいずれかに固有のようです。私のUbuntuボックスには8GBのRAMしかありません。つまり、グラフをロードして接続されたサブコンポーネント操作を実行した後、700MBしか空いていないので、おそらくOpenSuseマシンの(単純な)メモリの問題ではないと思います.
更新 2
それで、実際にUbuntuボックスでそれを再現しましたが、これは非常に奇妙ですが、メモリエラーに達した後でも、再び再現することはできません。試してみたい方は、マトリックス ファイルをここ (72 MB) から入手Save as...
できます。. cd
このファイルを含むディレクトリに単純に実行し、上で貼り付けたコードを実行します。インストールする必要がありますnetworkx
(明らかに)。
更新 3
OpenSuse システムを再起動してssh
実行すると、コードを正常に実行できます。問題が何であるかはまだわかりません-再起動前に約1GBの使用済みスワップスペースがあったという事実に関連している可能性がありますか?
更新 4
スワップの問題は関連していないようです (スワップ領域が使用されていない場合でも、エラーを再現できます)。これは面倒です。現在のところ、再起動のみが役に立ちます。