[解決済み] 形状やデータ型を持つ配列が割り当てられない
質問
Ubuntu 18でnumpyの巨大な配列を割り当てる問題に直面していますが、MacOSでは同じ問題に直面していません。
numpyの配列にメモリを割り当てようとしているのですが、形状が
(156816, 36, 53806)
で
np.zeros((156816, 36, 53806), dtype='uint8')
で、Ubuntu OSではエラーが出るのに
>>> import numpy as np
>>> np.zeros((156816, 36, 53806), dtype='uint8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
numpy.core._exceptions.MemoryError: Unable to allocate array with shape (156816, 36, 53806) and data type uint8
MacOSで出ないんだけど。
>>> import numpy as np
>>> np.zeros((156816, 36, 53806), dtype='uint8')
array([[[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
...,
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0]],
[[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
...,
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0]],
[[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
...,
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0]],
...,
[[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
...,
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0]],
[[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
...,
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0]],
[[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
...,
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0]]], dtype=uint8)
どこかで読んだことがあるのですが
np.zeros
配列に必要なメモリ全体を本当に割り当てるのではなく、0以外の要素に対してのみ割り当てるべきです。Ubuntuマシンには64GBのメモリがあるのに、私のMacBook Proには16GBしかないのです。
のバージョンがあります。
Ubuntu
os -> ubuntu mate 18
python -> 3.6.8
numpy -> 1.17.0
mac
os -> 10.14.6
python -> 3.6.4
numpy -> 1.17.0
追記:Google Colabでも失敗しました
解決するには?
これはおそらく、お使いのシステムの オーバーコミット処理 モードがあります。
デフォルトのモードでは
0
,
ヒューリスティックなオーバーコミット処理。アドレス空間の明らかなオーバーコミットは拒否されます。典型的なシステムで使用されます。スワップ使用量を減らすためにオーバーコミットを許可する一方で、ひどく乱暴な割り当てが失敗することを保証します。このモードでは、rootは少し多めのメモリを割り当てることができます。これはデフォルトです。
使用されている正確なヒューリスティックはここではうまく説明できませんが、これについては Linux over commit ヒューリスティック と このページでは .
を実行することで、現在のオーバーコミット・モードを確認できます。
$ cat /proc/sys/vm/overcommit_memory
0
この場合、アロケートするのは
>>> 156816 * 36 * 53806 / 1024.0**3
282.8939827680588
~カーネルは、明らかにこれだけの物理ページをコミットできるわけがない、と言って、割り当てを拒否しています。
もし(rootで)実行したら。
$ echo 1 > /proc/sys/vm/overcommit_memory
これにより、quot;always overcommit" モードが有効になり、実際にシステムがどんなに大きなアロケーションでも許可することがわかります(少なくとも64ビットメモリアドレス内)。
私は、32GBのRAMを搭載したマシンでこのことを自分でテストしました。 オーバーコミットモードで
0
も出ました。
MemoryError
に戻した後
1
が動作します。
>>> import numpy as np
>>> a = np.zeros((156816, 36, 53806), dtype='uint8')
>>> a.nbytes
303755101056
その後、配列内の任意の場所に書き込むことができます。システムは、あなたが明示的にそのページに書き込んだときのみ、物理ページを割り当てます。 このため、疎な配列には注意して使用することができます。
関連
-
パッケージングツールPyinstallerの使用と落とし穴の回避
-
任意波形を生成してtxtで保存するためのPython実装
-
[解決済み】Flaskのテンプレートが見つからない【重複あり
-
[解決済み】ValueError: xとyは同じサイズでなければならない
-
[解決済み] Python RequestsでJSONデータをPOSTする方法とは?
-
[解決済み] NumPyで、CSVデータをレコード配列に読み込むにはどうしたらいいですか?
-
[解決済み] numpy.arrayの形状(R, 1)と(R,)の違いについて
-
[解決済み】大文字と数字を含むランダムな文字列の生成
-
[解決済み】type()とisinstance()の違いは何ですか?)
-
[解決済み】メソッドの型ヒントは、どのようにエンクロージャクラスの型を使用するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
PythonによるLeNetネットワークモデルの学習と予測
-
ピローによる動的キャプチャ認識のためのPythonサンプルコード
-
python call matlab メソッドの詳細
-
Python jiabaライブラリの使用方法について説明
-
[解決済み] [Solved] sklearn error ValueError: 入力に NaN、infinity または dtype('float64') に対して大きすぎる値が含まれている。
-
[解決済み】ImportError: sklearn.cross_validation という名前のモジュールがない。
-
[解決済み] _tkinter.TclError: 表示名がなく、$DISPLAY環境変数もない。
-
[解決済み】Python regex AttributeError: 'NoneType' オブジェクトに 'group' 属性がない。
-
[解決済み】ImportError: PILという名前のモジュールがない
-
[解決済み] Python シェルが 32bit で実行されているか 64bit で実行されているかを判断するにはどうすればよいですか?