私は、機械化とスレッディングを使ってウェブサイトに接続して作業するために使用する約50のクラスを書きました。それらはすべて同時に動作しますが、お互いに依存しません。つまり、1クラス - 1ウェブサイト - 1スレッドを意味します。コードの多くは各クラスで繰り返されます(しかし、一部のサイトでは、メソッドの途中で取得されたデータを追加処理する必要があるため、引数を渡すためにクラスを1つにするには十分ではありません) - 「ログイン」のように - 他人が必要としないかもしれない)。私が言ったように、それはエレガントではない - しかし、それは動作します。言うまでもなく、各Webサイトのアプローチに1つのクラスを使用せずに、これをどのように書くか全推奨事項を歓迎します。各クラスの追加機能や全体的なコード管理を追加するのは大変な作業です。どのようにスレッドのPythonコードのメモリ使用量を減らすには?
しかし、私たちはおよそ400メガバイトの利用状況を見ている50個の実行中のスレッドを持つように、各スレッドは、8メガバイトのメモリほどかかりますことを、分かりました。私のシステムで動作していたのであれば問題はありませんが、1GBのメモリしか搭載していないVPSで動作しているので、問題になり始めています。メモリ使用量を減らす方法を教えてもらえますか、複数のサイトを同時に使用する方法はありますか?
私はそれはメモリ、または何か他のものを使用している私のアプリケーションの変数に格納されたデータだかどうかをテストするためにこのクイックテストのpythonプログラムを使用していました。次のコードでわかるように、sleep()関数の処理だけですが、各スレッドは8MBのメモリを使用しています。
from thread import start_new_thread
from time import sleep
def sleeper():
try:
while 1:
sleep(10000)
except:
if running: raise
def test():
global running
n = 0
running = True
try:
while 1:
start_new_thread(sleeper,())
n += 1
if not (n % 50):
print n
except Exception, e:
running = False
print 'Exception raised:', e
print 'Biggest number of threads:', n
if __name__ == '__main__':
test()
私はこれを実行すると、出力は次のとおりです。
50
100
150
Exception raised: can't start new thread
Biggest number of threads: 188
そしてrunning = False
行を削除することによって、私はその後、シェルでfree -m
コマンドを使用して空きメモリを測定することができます。
total used free shared buffers cached
Mem: 1536 1533 2 0 0 0
-/+ buffers/cache: 1533 2
Swap: 0 0 0
実際なぜ私はスレッドあたり約8メガバイトを取っていることを知っている計算する前に、上記のテストアプリケーションの間に使用されたメモリの違いを分割することによって簡単ですアプリケーションが動いているgを開始できる最大スレッド数で割ったものです。
top
を見ることで、pythonのプロセスは、メモリの約0.6%を使用していますので、おそらく唯一の割り当てられたメモリです。
メモリは何を占めていますか?私はあなたがサイトから抽出したデータだと推測しています。その場合、おそらく実行スレッドの数を制限することができないほど多くはありません。 –
どのように正確にメモリ使用量を測定しますか?私は、それらの8MBがそれぞれのスレッドに本当に割り当てられていないと思います。それらの8MBの大部分はスレッド間で共有されるかもしれません(ちょうど推測..)? – Frunsi
Demianとfrunsi、私はあなたの質問の両方に答えるために私の質問を編集しました。ありがとう! – Gargauth