4

私は大きな (漬けたときは 150kB) ダミーの辞書を作成し、その上でダミーの関数を実行しています。

同じ関数が rpyc.Service を介して公開されると、クライアントとサーバーが同じホスト上にある場合でも、所要時間は (0.0009 秒ではなく) 10 秒になります (ここでは LAN 遅延の問題はありません)。

私の 150kB オブジェクトがクライアントから同じホスト上のサーバーに通信されるのになぜそんなに時間がかかるのですか?

dummy.dummy()また、入力オブジェクトがまだ「使用可能」でない場合でも関数が呼び出されるのはなぜですか (使用可能である場合、関数で費やされる時間は 2 つのテスト ケースで同じになります)。

以下の私のpython(3.2)コードを参照してください。私は、dummy.dummy(d) で費やされた時間を測定します。

  1. ケース 1: dummy.dummy がクライアントによって呼び出されます。実行時間 = 0.0009
  2. ケース 2: dummy.dummy は rpyc サービスと呼ばれます。実行時間 = 10 秒

mini_service.py

import rpyc
from rpyc.utils.server import ThreadedServer
import dummy

class miniService(rpyc.Service):
    def exposed_myfunc(self,d):
        #Test case 2: call dummy.dummy from the service
        dummy.dummy(d)

if __name__=='__main__':
    t = ThreadedServer(miniService,protocol_config = {"allow_public_attrs" : True}, port = 19865)
    t.start()

mini_client.py

import rpyc
import sys
import pickle
import dummy

def makedict(n):
    d={x:x for x in range(n)}
    return d

if __name__ == "__main__":
    d=makedict(20000)
    print(sys.getsizeof(d))             #result = 393356

#   output = open("C:\\rd\\non_mc_test_files\\mini.pkl",'wb') #117kB object for n=20k
#   pickle.dump(d,output)
#   output.close()

#RUN1 : dummy.dummy(d) out of rpyc takes 0.00099 seconds
#   dummy.dummy(d)

#RUN2 : dummy.dummy(d) via RPYC on localhost takes 9.346 seconds
    conn=rpyc.connect('localhost',19865,config={"allow_pickle":True})
    conn.root.myfunc(d)

    print('Done.')  

ダミー.py

import time

def dummy(d):
    start_ = time.time()
    for key in d:
        d[key]=0
    print('Time spent in dummy in seconds: ' + str(time.time()-start_)) 
4

1 に答える 1

2

パフォーマンスの低下は、クライアントとサーバー間でオブジェクト(参照によって渡される)の同期を維持するためにrpycによって実行された作業に起因するようです。

私が現在アプリケーションで行っているのは、入力オブジェクトのディープコピーを作成し、そのコピーを処理して、値渡しメカニズムをエミュレートすることです。

注:ディープコピーallow_picke=Trueでは、プロトコル構成パラメーターを設定する必要があります。

于 2013-01-23T09:20:14.107 に答える