2016-09-20 25 views
2

私は素数のデータベースを展開するプログラムを書いています。このプログラムはPythonで書かれており、8GB RAMのWindows 10(x64)で動作します。利用可能なメモリより多くのメモリを使用

listが見つかったすべての素数は、計算のためにintegersに保存され、実行中は約6-7GBのRAMが使用されます。しかし、いくつかの実行中に、この数字は100MBに下がった。実行中はメモリ使用量は低くなりますが、プライムアレイに追加される数値が増えるにつれ、予想通りに増加します。すべての実行でメモリが低下するわけではないことに注意してください。

メモリ使用量は、タスクマネージャで測定

これらは、次の理論に私をリードしてきました降下一見ランダム:私のコードにバグが、それは重要なデータをドロップすることとめちゃくちゃ、あります

  1. 結果(ほとんどの場合、結果によってはサポートされない可能性があります)
  2. Pythonはちょっとしばらくしてコードを最適化しています。
  3. PythonまたはWindowsは、それほど使用されていないプライム番号配列の部分を削除することで、RAMの過剰使用を補います。 (最終的に計算が不正確になる)
  4. PythonまたはWindowsはRAMの代わりにディスク領域を割り当てることで、RAMの過剰使用を補います。このメモリドロップの理由(複数可)何ができるか

質問

  1. どのように使用可能なRAM以上を使用するプログラムは、Pythonで処理されますか?
  2. Windowsは、使用可能なRAMを超えて使用するプログラムをどのように処理しますか?

答えて

5

1,2,3は間違った理論です。

4が正しいです。 Windows(Pythonではなく)は、プロセスメモリの一部をスワップ空間に移動しています。これはアプリケーションにほとんど完全に透過的です。この状況に対応するために特別な処理を行う必要はありません。あなたが気付く唯一の事は、情報がディスクに書き込まれたり、ディスクから読み込まれるときに、アプリケーションが遅くなることです。しかし、すべてが透過的に起こります。詳細については、https://en.wikipedia.org/wiki/Virtual_memoryを参照してください。

+0

RAMに残っているデータは、最も使用されたデータ(リストの最初の部分を意味し、ほぼすべて反復されます)と最も新しく追加されたデータ(最後の部分リスト)?最も発行されていないデータ(中間)はスワップ領域に送られますか? –

+0

@FelixZY:たぶん。仮想メモリを管理しているWindowsは、リストのどの部分がどの部分であるかについての知識がありません。それは単にメモリのページで、そのうちのいくつかは他のものより頻繁に使用されるようです。 OSはあまり使用されていないように見えるものを取り除きます。アプリケーションライターとしては、どちらがどちらであるかについて多くの制御や知識がありません。 –

1

ページングについて聞いたことがありますか? Windowsは、コンピュータを使い果たしたり、最終的にクラッシュするのを防ぐために、ハードドライブにいくつかのRAM(しばらくは使用されていない)をダンプします。

Windowsはメモリ管理のみを扱います。ただし、Windows 10を使用している場合は、zipファイルのようにメモリを圧縮します。

+0

私はページングについて聞いたことがありますが、私はこの方法で適用できるかどうかは確かではありませんでした。私の質問で理論#4を参照してください。 –

+0

ええええええええええええええええるコメント –

関連する問題