python--MemoryError: Unable to allocate array with shape

1702 ワード

システム環境
  • Ubuntu 16.04.6 LTS(サブシステム)
  • Python 3.7.3

  • エラー原因
    np.zeros((5684, 15074, 84),dtype=‘float32’) MemoryError: Unable to allocate array with shape (5684, 15074, 84) and data type float32
    システムの過剰処理モード(overcommit handing)がトリガーされ、Linuxはほとんどの申請メモリの要求に「yes」を返信し、より大きなプログラムを実行することができます.メモリを申請した後、すぐにメモリを使用することはありません.この技術をOvercommitといいます.メモリが不足すると、OOM killer(OOM=out-of-memory)が発生します.メモリを解放するために、カーネルスレッドではなくユーザー・ステータス・プロセスを殺すことを選択します.Overcommitは、次の2つのvmの構成と関係があります.
    vm.overcommit_ratio 
    vm.overcommit_memory
    
    overcommit_memory 0,1,2-デフォルト設定.アプリケーション・プロセスがメモリを申請しようとすると、カーネルは十分なメモリ供給用プロセスが使用できるかどうかを確認します.十分なメモリがある場合は、メモリ申請が許可されます.そうでない場合、メモリ申請に失敗し、エラーを適用プロセスに返します.例えば、1 Gのマシンでは、Aプロセスが500 Mを使用しています.malloc 500 Mのメモリを別のプロセスで試してみると、カーネルはチェックを行い、残りの使用可能なメモリを超えていることがわかり、失敗を示すことがあります.
    1-メモリの申請要求に対して、カーネルは物理メモリがなくなるまでcheckを行わず、OOMのユーザー・ステータス・プロセスをトリガーします.同様に上記の例では,1 Gのマシン,Aプロセス500 M,Bプロセスがmalloc 500 Mを試みると成功するが,kernelがメモリ使用率が1 Gに近いことを発見するとOOMをトリガし,ユーザ状態のプロセス(ポリシーのある殺し)をいくつか殺す.
    2-要求されたメモリ>=SWAPメモリサイズ+物理メモリ*Nの場合、このメモリ申請は拒否されます.このN:Nはovercommit_によるパーセンテージですratio/100でovercommit_などのratio=50ならNは50%です.vm.overcommit_ratioはvm.overcommit_memory=2の場合のみ有効で、メモリ申請可能メモリはSWAPメモリサイズ+物理メモリ*overcommit_ratio/100システムovercommit情報を表示するには:
    root@DESKTOP-KDVCG22:# grep -i commit /proc/meminfo
    CommitLimit:      515524 kB
    Committed_AS:    3450064 kB
    

    CommitLimit:最大割り当て可能メモリCommitted_AS:現在割り当てられているメモリサイズ
    解決策
    vm.overcommit_memoryは1にすればいいです.
    cat /proc/sys/vm/overcommit_memory 
    echo 1 > /proc/sys/vm/overcommit_memory
    

    リファレンスリンク
    stackoverflow overcommit handling