web-dev-qa-db-ja.com

128 GBのメモリでも、グラフのクラスタリングでメモリエラーが発生する。どうして?

128 GBのメモリを備えたLinuxサーバーでpython言語を使用しています。 Markovアルゴリズムを使用してグラフのクラスタリングを行っています。プロセスの詳細は次のとおりです。

Graphtype = nx.Graph()
G = nx.from_pandas_edgelist(df, 'source','target', Edge_attr='weight', create_using=Graphtype)

グラフの詳細:

Name: 
Type: Graph
Number of nodes: 4533801
Number of edges: 10548751
Average degree:   4.6534

グラフは接続されていますか?

nx.is_connected(G)
False

接続されているコンポーネントの数

print(nx.number_connected_components(G))
7254

マルコフクラスタリング

import markov_clustering as mc
import networkx as nx

matrix = nx.to_scipy_sparse_matrix(Gc) # build the matrix
result = mc.run_mcl(matrix)            # run MCL with default parameters
clusters = mc.get_clusters(result)     # get clusters

MemoryError

enter image description here

クラスターを抽出しようとすると、依然としてメモリエラーメッセージが表示されるのはなぜですか?どうした?どうすればこれを回避できますか?

UPDATE:

与えられたコメントを考慮した結果の報告。 enter image description here

3
Taie

あなたのコードからは、32ビットのPythonを使用していると思います。つまり、ハードウェアに関係なく、4 GBを超えるRAMを使用することはできません。

64ビットにアップグレードするPythonを使用すると、最大16EBのRAMを使用できます。これにより、サーバー上にある追加のスペースを使用できます。

someメモリを節約するには、不要な変数を保存せず、python破棄された情報を消去します。これらのコード行で確認できることから:

matrix = nx.to_scipy_sparse_matrix(Gc) # build the matrix
result = mc.run_mcl(matrix)            # run MCL with default parameters
clusters = mc.get_clusters(result)     # get clusters

「マトリックス」および「結果」変数は「クラスター」に到達するためにのみ使用されるため、理論的には保存する必要はありません。このコードは、pythonにメモリの一部をクリアする権限を与える必要があります。

clusters = mc.get_clusters(mc.run_mcl(nx.to_scipy_sparse_matric(Gc)))

明らかに、コードの読みやすさと優雅さを犠牲にしているため、問題を解決するのに十分なスペースが解放される可能性は低いですが、念のために注意を向ける価値はあります。

1
houseofleft