2012-04-17 14 views
1

pythonでこのテストコードをスピンアップして、Python 2.7を使用してWinxpのRedisに転送するにはどうすればよいですか? マルチプロセッシングは良いでしょうか? 6000/sの負荷率は100,000/sの速度を公表します。 私は10万を選択しましたが、テストで低下する可能性があります。プロセスには15秒かかります。Redisサーバ入力を高速化する

サーバヘルプの設定を変更しますか? mulitprocessingとCLIを使用してデータを「監視対象」については、以下のコードを使用し

import time 
from time import strftime 
import redis 
import threading, Queue 

start_time = time.time() 
cxn = redis.StrictRedis('127.0.0.1',6379,1) 


class WorkerMain(threading.Thread): 
    def __init__(self, queue): 
     threading.Thread.__init__(self) 
     self.queue = queue 

    def run(self): 
     while 1: 
      try: # take a job from the queue    
       row = self.queue.get_nowait()   
      except Queue.Empty: raise SystemExit 

      try: 
       cxn.set(row, "Row") 
       #print (row, "Row") 
      except: print 'Setup Error' 

if __name__ == '__main__': 
    connections = 5 

    sml = range(1,100000)  
    queue = Queue.Queue() 
    for row in sml: 
     queue.put(str(row)) 

    threads = [] 
    for dummy in range(connections): 
     t = WorkerMain(queue) 
     t.start() 
     threads.append(t) 

    # wait for all threads to finish 
    for thread in threads: 
     thread.join() 


print 
end_time = time.time() 
duration = end_time - start_time 
print "Duration: %s" % duration 

...いないすべてのデータがサーバーに入りました。

from multiprocessing import Pool 
import time 
import redis 

start_time = time.time() 
cxn = redis.Redis('127.0.0.1',6379,1) 

def rset(var): 
    cxn.set(var,"value") 

if __name__ =='__main__': 
    sml = range(1,10000) 
    #for x in sml:print x 

    pool = Pool(processes=5) 
    for row in sml: 
     pool.apply_async(rset, [(row,)]) 
     #print result.get(), 


end_time = time.time() 
duration = end_time - start_time 
print "Duration: %s" % duration 

ここはパイプラインコードです......私はちょうどスレッドのものをコメントアウトしました。あなたが原因ギルのCPythonの(標準のPythonインタプリタ)を使用する場合、パフォーマンス向上のためのスレッドを使用して

from time import strftime 
import redis 
import threading, Queue 

start_time = time.time() 
cxn = redis.StrictRedis('127.0.0.1',6379,0) 
pipe = cxn.pipeline(transaction=False) 

class WorkerMain(threading.Thread): 
    def __init__(self, queue): 
     threading.Thread.__init__(self) 
     self.queue = queue 

    def run(self): 
     while 1: 
      try: # take a job from the queue    
       row = self.queue.get_nowait()   
      except Queue.Empty: raise SystemExit 

      try: 
       cxn.set(row, "Row") 
       #print (row, "ROw") 
      except: print 'Setup Error' 

if __name__ == '__main__': 
    #connections = 5 

    sml = range(1,100000)  
    #queue = Queue.Queue() 
    for row in sml: 
     #queue.put(str(row)) 
     pipe.set(str(row),"value").execute()# key, value 

    # threads = [] 
    # for dummy in range(connections): 
    #  t = WorkerMain(queue) 
    #  t.start() 
    #  threads.append(t) 
    #  
    # # wait for all threads to finish 
    # for thread in threads: 
    # thread.join() 



print 
end_time = time.time() 
duration = end_time - start_time 
print "Duration: %s" % duration 
+0

のUSEパイプライン〜5倍高速。 http://blog.jmoz.co.uk/python-redis-py-pipeline – jmoz

答えて

2

使用パイプラインを動作するはずです。パイプラインはコマンドをバッチして、ネットワークのオーバーヘッドを支払うことはありません。

を参照してください:Redis.ioにここhttps://github.com/andymccurdy/redis-py

  • パイプライン経由のパイプラインで

    1. 節 - http://redis.io/topics/pipelining
  • +0

    初心者初心者です!パイプラインはdocからのストリームデータを処理しませんでした。私は今日のサイズを知っているが、データがストリーミングされるとどうなるだろうか? – Merlin

    +0

    パイプライン処理では、データのサイズや長さを事前に把握する必要はありません。上にリンクしたredis-pyのドキュメントを見てみることをお勧めします。パイプラインを使用するのは本当にシンプルで、スピードアップが可能です。 –

    +0

    チェックされたパイプライン:オーバーヘッドが追加されましたが、パフォーマンスが向上しませんでした。 – Merlin