2016-02-13 79 views
1

客戶端通過套接字發送數據。數據被解析並放入列表中。Python對列表隊列進行迭代 - 刪除重複且速度緩慢

這工作正常。

有時它包含重複的數據,我想用這個數據替換舊數據,所以我.pop()出來並追加到新數據中。

這工作正常......一段時間。

某處有一個放緩。我正在判斷數據量相當一致的速度。它通過所有的速度開始並持續約10分鐘左右。在那個時候,它必須不斷清理舊的比賽,名單的大小也差不多。

但是之後當控制檯飛過那個數量時,控制檯就變成了一個相當慢的「刪除重複數據」的牆。

而且,因爲這需要更多的時間才能被添加到隊列中,並且它變成了無法追趕的永無止境的循環。

片段的當前代碼:

def QDUmp(): #Runs as a thread 
    while 1: 
     while not q.empty(): 

      print q.get() 

      XMLdataparse = [] 
      del XMLdataparse[:] 
      XMLdataparse[:] = [] 
      XMLdataparse = q.get().split('--ListBreaker--') 

      if len(XMLdataparse) == 20: 

       if "EventText" in XMLdataparse[0]: 
        TheCounter = len(EventTags)-1 
        for Events in reversed(EventTags): 
         try: 
          EventN = EventNames[TheCounter] 
          PlaceN = PlaceNames[TheCounter] 
          TypeN = BetHorsessToMake[TheCounter] 
          OldTag = EventTags[TheCounter] 

          if EventN == str(XMLdataparse[2]) and PlaceN == str(XMLdataparse[3]) and TypeN == str(XMLdataparse[4]): 
           print "removing dupe: ",TypeN 
           EventTags.pop(TheCounter) 
           EventTimes.pop(TheCounter) 
           EventNames.pop(TheCounter) 
           PlaceNames.pop(TheCounter) 

          TheCounter = TheCounter - 1 
         except: 
          print "problem removing a duplicate result" 

       if float(XMLdataparse[6]) > float(XMLdataparse[18]): 
        EventTags.append(XMLdataparse[0]) 
        EventTimes.append(XMLdataparse[1]) 
        EventNames.append(XMLdataparse[2]) 
        PlaceNames.append(XMLdataparse[3]) 


class ThreadedServer(object): 
    def __init__(self, host, port): 
     self.host = host 
     self.port = port 
     self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
     self.sock.bind((self.host, self.port)) 

    def listen(self): 
     self.sock.listen(5) 
     while True: 
      client, address = self.sock.accept() 
      client.settimeout(60) 
      threading.Thread(target = self.listenToClient,args = (client,address)).start() 

    def listenToClient(self, client, address): 
     size = 1024 
     while True: 
      try: 
       data = client.recv(size) 
       if data: 
        try: 
         BigSocketParse = [] 
         del BigSocketParse[:] 
         BigSocketParse[:] = [] 
         BigSocketParse = data.split('--MarkNew--') 

         print "Putting data in queue" 
         for eachmatch in BigSocketParse: 
          q.put(str(eachmatch)) 

        except: 
         print "Unable to parse socket text." 

        #q.put(data) 
        #QCheck.start() 
       else: 
        raise error('Client disconnected') 
      except: 
       client.close() 


CheckQ = Thread(target = QDUmp) 
CheckQ.start() 

ThreadedServer('',1234).listen() 

的數據被髮送,與使用--MarkNew--作爲分隔符一個較大的插座和我打破它到後--ListBreaker--列表部件那。也許不是最有效的做法,但套接字的大小基本相同,所以放緩必須是我處理列表的方式。

在我的頭頂,首先它效率不高,因爲它必須經歷整個列表。但我不知道另一種方法來擺脫重複。

任何關於此的指針將非常感激。

更新:

我會找到一個辦法把它處理也許兩個條目的打,而不是幾百個,比較整個插座數據進來,而不是每個單獨的一部分,但贏得不幸的是,這項工作無法完成。我必須能夠保留個別部分,如果他們是新的,並刪除重複。我無法想出一個不必這樣做的方法。

正在考慮多線程它。它可能佔用資源,但至少它不會把所有東西都停下來,但是我開始使用隊列的原因是沒有多個線程同時讀寫這些列表。

更新#2:

等一下...

異常處理程序不動TheCounter上,這意味着它不會正確前進但如果是拋出異常,它會無論如何,把所有的東西都扔掉了。這可能解釋了一個或兩個在開始減速時出現的其他錯誤。

只需使用一個列表即可重做一些東西。

我可以將其更改爲一個列表而不是幾個或只比較一個條目而不是三個,但我很難相信這可能是放緩的原因。

更新#3:

它簡化爲只從一個列表彈出。將數據寫入XML的函數現在首先複製列表,以便從隊列寫入的不同隊列中進行工作。

這改進了一些東西,但仍然比我預期的要慢。

+0

當我想避免重複,集合出現在我的腦海。任何你不使用set的原因,並將傳入的數據添加到一個集合,所以你不必擔心刪除重複的數據? –

+1

我之前並沒有真正看過套裝,看起來並不像我需要的那樣。如果每個套接字的某些位與現有套接字相匹配,我需要從最後一個套接字中刪除所有內容,並將新套接字中的所有內容保留在原來的位置。他們看起來很方便,但不適合這種情況。 – PoweredByCoffee

+0

我猜這是不安全的,因爲我必須彈出部分... – PoweredByCoffee

回答

0

我已經減少了處理一個列表,似乎加快了速度,並同時修復了一些其他問題。

我知道它看起來很奇怪,但我認爲這是有效的,因爲我將能夠得到它。