10

この質問はhereから派生しています。

Python オブジェクト ( l1l2およびl3) を含む 3 つの大きなリストがあります。これらのリストは、プログラムの起動時に作成され、合計 16 GB の RAM を使用します。このプログラムは Linux でのみ使用されます。

これらのリストまたはこれらのリスト内のオブジェクトは、作成後に何らかの方法または形式で変更する必要はありません。プログラムが終了するまで、それらはメモリに残っている必要があります。

プログラムで os.fork() と multiprocessing モジュールを使用して、複数のサブプロセス (現在は最大 20) を生成しています。l1これらの各サブプロセスは、3 つのリスト ( 、l2および)を読み取ることができる必要がありますl3

それ以外の場合、私のプログラムは正常に動作し、非常に高速です。ただし、メモリ消費に問題があります。Linux のコピー オン ライト アプローチにより、各サブプロセスが 3 つのリストをメモリにコピーせずに使用できることを期待していました。ただし、これらのリストのいずれかのオブジェクトを参照すると、関連する参照カウントが増加し、メモリのページ全体がコピーされるため、これは当てはまりません。

だから私の質問は次のようになります:

l1l2およびl3これらのリスト内のすべてのオブジェクトの参照カウントを無効にすることはできますか? 基本的に、オブジェクト全体 (参照カウントなどのメタデータを含む) を読み取り専用にして、いかなる状況でも変更されないようにします (これにより、コピーオンライトを利用できると思います)。

現在、私は現在必要のない「機能」(参照カウント)のために、このタスクを達成するために別のプログラミング言語に移動することを余儀なくされているのではないかと心配していますが、それでも私に強制され、不必要な問題を引き起こしています。

4

1 に答える 1

4

できません。参照カウントはCPython (参照実装、および使用しているもの) の基本です。オブジェクトでメソッドを使用すると、参照カウントが変更され、アイテムのサブスクリプションまたは属性アクセスにより、参照カウントを使用するスタックにオブジェクトが追加および削除されます。これを回避することはできません。

リストの内容が変わらない場合は、tuple()代わりに s を使用してください。ただし、それらが参照カウントされるという事実は変わりません。

Python の他の実装 (Jython (Java 仮想マシンを使用)、IronPython (.NET ランタイム言語)、または PyPy (Python は Python で実装されていますが、JIT およびその他のコンパイラ技術を実験中) は、メモリ管理のさまざまな方法を自由に使用できます。メモリの問題を解決する場合としない場合があります。

于 2013-01-03T12:45:02.880 に答える