2016-02-13 26 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

我已经减少了处理一个列表,似乎加快了速度,并同时修复了一些其他问题。

我知道它看起来很奇怪,但我认为这是有效的,因为我将能够得到它。