2017-08-28 7 views
0

いくつかの計算で大きな2D配列を初期化する必要があります。私はコードを実行すると "メモリエラー"が表示されます。コードはここPythonで大きな2D配列を操作する

a=np.zeros((200000,200000)) ## I get memory error in this line 

for i in range (0,len(rows)): 
    for j in range (0,len(rows)): 
     if pq[rows[i],cols[j]]>0: 
      a[rows[i],cols[j]]=1 
     else: 
      a[rows[i],cols[j]]=0 

下に与えられるように、「行」および「colsの」が長さの1Dアレイは200000 PQの寸法は433 X 800

Iは64ビットのWindows 10を使用していますされていますインテル®Core™i7-4770S CPU @ 3.10GHz×8プロセッサー(16Gb RAM搭載)私はPython 2.7.12を使用しています。

この問題を解決するための助けに感謝します。私はPythonには新しく、事前に感謝します。

pyTablesまたはジェネレータを使用してこの問題を解決できますか?私はちょうどそれらをオンラインで読んだ。

+0

大きなメモリスペースを割り当てることはできないのでしょうか? これを4つのより小さな配列に分割できますか? –

+0

さらなる計算のための入力として配列が必要です。小さな配列に分割することはできません。 – user30

答えて

3

まず、Pythonアーキテクチャについて言及していません。 32ビットの場合、RAMの容量は2Gbです。

第2に、200000 * 200000 * 1バイト(少なくとも小さいintの場合)= 37GbはRAMよりも小さく、どのような方法でも割り当てることはできません。

第3に、データがまばらです。配列のほとんどがゼロになることを意味します。この場合、配列を割り当てるのではなく、データの座標を格納しておく必要があります(これはすでにpqに入っています)。このデータ表現で動作するアルゴリズムを作り直す必要があります。

+0

私のpythonアーキテクチャは64ビットです。私はそれを言及してごめんなさい申し訳ありません。私はさらなる計算のための入力として '配列a'が必要です。 – user30

2

問題は、あなたの行列が本当に巨大であることです。 セルあたり1バイト(過小評価されている)と仮定すると、完全に格納するには、200000 * 200000 = 40GBが必要です。

Sparse Matrixesをご覧ください。これは、ゼロ以外の値しか格納しない行列です。この場合、多くのスペースを節約できます。

関連する問題