2017-10-04 16 views
1

DASK Shedulerのメモリ使用量を増やす:はゆっくりと私がテストを実行している

client = Client('127.0.0.1:8786') 

def x(i): 
    return {} 

while True: 
    start = time.time() 
    a = client.submit(randint(0,1000000)) 
    res = a.result() 
    del a 
    end = time.time() 
    print("Ran on %s with res %s" % (end-start, res)) 

client.shutdown() 
del client 

私は私のクエリパフォーマンスの推定値を取得するには(より多くのコードで)それを使用しました。しかし、この例では、私が考えることができるすべてのものを削除しました。

上記のコードのリークは約0.1 MB /秒です。これは1000コールあたり約0.3MBと推測しています。

私のコードで何か問題がありますか?

答えて

1

私のpythonのデバッグのスキルはちょっと錆びています(そして、ちょっと私は2009年にhttps://pypi.python.org/pypi/orbitedのOrbited(ウェブソケットの先駆け)上でobjgraphを使用したことを意味します)。 :

、スケジューラ内のオブジェクトを数える前とobjgraph.show_most_common_types()

| What  | Before   | After | Diff | 
|-------------+------------------+--------|---------+ 
| function | 33318   | 33399 | 81 | 
| dict  | 17988   | 18277 | 289 | 
| tuple  | 16439   | 28062 | 11623 | 
| list  | 10926   | 11257 | 331 | 
| OrderedDict | N/A    | 7168 | 7168| 

を使用した後はいかなる場合でもRAMの膨大な数ではないが、より深い私はトンのscheduler._transition_counterは11453とscheduler.transition_logであることがわかった掘りで満たされています:

もちろん私の部分の最初のエラーが移行ログの長さを設定していなかった実現するために私を導いた私の部分に
('x-25ca747a80f8057c081bf1bca6ddd481', 'released', 'waiting', 
     OrderedDict([('x-25ca747a80f8057c081bf1bca6ddd481', 'processing')]), 4121), 
('x-25ca747a80f8057c081bf1bca6ddd481', 'waiting', 'processing', {}, 4122), 
('x-25cb592650bd793a4123f2df39a54e29', 'memory', 'released', OrderedDict(), 4123), 
('x-25cb592650bd793a4123f2df39a54e29', 'released', 'forgotten', {}, 4124), 
('x-25ca747a80f8057c081bf1bca6ddd481', 'processing', 'memory', OrderedDict(), 4125), 
('x-b6621de1a823857d2f206fbe8afbeb46', 'released', 'waiting', OrderedDict([('x-b6621de1a823857d2f206fbe8afbeb46', 'processing')]), 4126) 

まずエラー

設定transition-log-length 10に設定した後:

簡単にGoogleが _lru_list_elemが順番にで key_splitに呼び出され @functools.lru_cacheによって行われることがわかっ
| What   | Before | After | Diff | 
| ---------------+----------+--------+---------| 
| function  | 33323 | 33336 | 13  | 
| dict   | 17987 | 18120 | 133 | 
| tuple   | 16530 | 16342 | -188 | 
| list   | 10928 | 11136 | 208 | 
| _lru_list_elem | N/A  | 5609 | 5609 | 

distributed/utils.pyで)LRUキャッシュである

、最大100 000項目の

第二にしようと、その後、再び私のスクリプトを実行していると私は100K _lru_list_elemに近づくまで、それは非常に高速登りメモリを見た後およそ10K _lru_list_elem

に登る必要がありますDASKとして表示されたコードに基づいて
それはほぼ完全に登るのを止める。

これは、ケースのように表示されますので、かなりフラットライン100K

のでMemory usage for Dask

ノーリークした後、しかし楽しいDASKのソースコードやPythonのメモリプロファイラで汚れた手を取得する

0

Daskスケジューラは、診断、ロギング、およびパフォーマンス上の理由から、固定サイズのデスクでワーカーやクライアントとの多くのやりとりに関する記録を保持します。これらの記録は蓄積されますが、限られた範囲でしか蓄積されません。

また、大きすぎるものを守らないようにします。

あなたが見たことのような素敵なラウンドナンバーまでメモリ使用量が増えているのを見てから、安定しているように見えます。

関連する問題