再更新
これを再現する簡単な方法を作成しようとしましたが、成功していません。
これまで、さまざまな単純な配列の割り当てと操作を試してきましたが、それらはすべて、単に SIGKILL がクラッシュするのではなく、MemoryError をスローします。
例えば:
x =np.asarray(range(999999999))
また:
x = np.empty([100,100,100,100,7])
必要に応じて MemoryErrors をスローするだけです。
いつかこれを再現する簡単な方法があればいいなと思っています。
更新終了
numpy/scipy といくつかのカスタム C 拡張機能を実行する Python スクリプトがあります。
Virtual Box の下の私の Ubuntu 14.04 では、正常に完了します。
Amazon EC2 T2 マイクロ インスタンスでは、(しばらく実行した後) 次の出力で終了します。
殺された
Python デバッガーで実行すると、シグナルがキャッチされず、デバッガーも終了します。
strace の下で実行すると、次のようになります。
munmap(0x7fa5b7fa6000, 67112960) = 0
mmap(NULL, 67112960, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fa5b7fa6000
mmap(NULL, 67112960, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fa5affa4000
mmap(NULL, 67112960, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fa5abfa3000
mmap(NULL, 67637248, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fa5a7f22000
mmap(NULL, 67637248, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fa5a3ea1000
mmap(NULL, 67637248, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fa59fe20000
gettimeofday({1406518336, 306209}, NULL) = 0
gettimeofday({1406518336, 580022}, NULL) = 0
+++ killed by SIGKILL +++
「SIGKILL」をキャッチしようとしているときにgdbの下で実行すると、次のようになります:
[Thread 0x7fffe7148700 (LWP 28022) exited]
Program terminated with signal SIGKILL, Killed.
The program no longer exists.
(gdb) where
No stack.
Python のトレース モジュール (python -m trace --trace ) を実行すると、次のようになります。
defmatrix.py(292): if (isinstance(obj, matrix) and obj._getitem): return
defmatrix.py(293): ndim = self.ndim
defmatrix.py(294): if (ndim == 2):
defmatrix.py(295): return
defmatrix.py(336): return out
--- modulename: linalg, funcname: norm
linalg.py(2052): x = asarray(x)
--- modulename: numeric, funcname: asarray
numeric.py(460): return array(a, dtype, copy=False, order=order)
何が起こっているのかを理解するために、現時点では他に何も考えられません。
おそらくメモリが不足している可能性があると思います(AWSマイクロインスタンスです)が、それを確認または拒否する方法がわかりません。
プログラムが停止している場所を正確に特定するのに役立つ別のツールはありますか? (または、この問題に対して上記のツールのいずれかを間違った方法で実行していますか?)
アップデート
Amazon EC2 T2 マイクロ インスタンスにはデフォルトでスワップ スペースが定義されていないため、4 GB のスワップ ファイルを追加し、プログラムを最後まで実行することができました。
ただし、「Killed」ではなく「Not Enough Memory」に少し近いメッセージで終了するようにプログラムを実行する方法には、まだ非常に興味があります。
誰かに何か提案があれば、感謝します。