5

私のプログラムの一部としてMemoryError、何かをキャッチしてログに記録したいと考えています。現在、traceback.format_exception他のすべての例外をフォーマットするために使用しています。そのためにもそうしたいと思いMemoryErrorます。

ただし、を使用format_exceptionするには、より多くのメモリを使用する必要があります。これは、メモリが不足しているときに実行できないことです。

どうする?

MemoryError終了以外にスローされた場合、どうすればよいですか? 理想的には、それらをログに記録してから、ハンドラーとスローアー* の間のスタックの一部を解放することで十分なメモリが解放されたと仮定して、プログラムを再開します。

(* また、そのスタック セクションから発生する参照によってのみ存続するヒープ オブジェクトも)

4

3 に答える 3

2

最終的に使用したレシピ

def do_a_generic_memory_hungry_thing(specific_context):
    memory_error = MemoryError(str(specific_context)) # pre-allocate it
    try: memory_hungry_stuff()
    except MemoryError: raise memory_error

memory_hungry_stuff結局のところ、との間のトレースexceptは興味深いものではありません。興味深い部分はspecific_contextであるため、この場合、事前割り当てを行うと 2 倍になります。

: 印刷 (実際には: フォーマット) しようとしてメモリ エラーが発生したmemory_errorため、これは防弾ではありません。おそらく、ダッドストリングをリリースすることと組み合わせると、うまくいくでしょう。

于 2013-11-20T09:33:17.670 に答える
1

一般に、メモリ不足エラーは、プログラムで処理するのが最も困難な問題である可能性があります。これは、何かを実行できるメイン リソースが不足しているためです。おそらく、プログラムは、出力から障害を検出してログに記録するスクリプトで実行できます。

メモリ不足エラーで「解放」されること唯一の目的とするメモリを使用してみてください。しかし、私はPythonでのそのアプローチについて楽観的ではありません.

于 2013-10-19T18:46:30.783 に答える