3

大量のスレッド(2000)を作成し、何かを処理してから書き出す基本的なpythonプログラムがあります。

コードを次のように絞り込みました (2k スレッド): URL fetch thread example on: http://www.ibm.com/developerworks/aix/library/au-threadingpython/

クラス内を除いて、私は文字通り何もしません(キューからアイテムを取得してから、タスクを完了に呼び出します)。この縮小バージョンと私が実行するバージョンの両方で、メモリ使用量は同じです。32 ビットの Python インタープリターでは、約 105 MB の仮想メモリを使用します。64 ビットでは、8 ギガ以上を使用します。

rhel 6 を実行しています。また、追加しました: threading.stack_size(32768) スタック サイズを小さくします。私はPythonが予約するメモリのデフォルトの制限を取得していると仮定していますが、その制限が何であるかを理解することはできません。

何か案は?

ありがとう!

4

2 に答える 2

2

RHEL6 を使用している場合、または glibc が 2.10 より新しい場合 (rpm -q glibc で確認できます)。これは、MALLOC_ARENA_MAX が欠落しているためです。

RHEL 6 では、glibc (>=2.10) の malloc に、各スレッドが独自のアリーナを割り当てることができる新しいアリーナ アロケーターがあります。また、再利用可能なアリーナの最大数は、コアの数によって異なります。64 ビット システムでは、これらのアリーナは 64M マッピングであり、16 コア システムのデフォルトのアリーナ数は最大 128 に達する可能性があります。簡単に 128*64MB = 8GB を取得できます。そのため、多くのスレッドを使用すると、大量の仮想メモリ (VMS) が発生する可能性があります (ただし、RSS の増加は完全に正常な場合があります)。

これは、env を設定することで解決できます。変数 MALLOC_ARENA_MAX を 1 や 4 などの小さい数値に変更します。

于 2013-05-27T14:58:29.067 に答える
0

本当に 2k 以上のスレッドが必要な場合は、Global Interpreter Lock (GIL) について読むことに興味があるでしょう: http://wiki.python.org/moin/GlobalInterpreterLock

于 2012-11-08T17:55:12.130 に答える