NDB nie usuwa pamięci podczas długiego żądania

Obecnie odciążam długie zadanie do kolejki zadań w celu obliczenia połączeń między obiektami NDB w magazynie danych.

Zasadniczo ta kolejka obsługuje kilka list kluczy jednostek, które mają być powiązane z innąquery przeznode_in_connected_nodes funkcja wGetConnectedNodes węzeł:

class GetConnectedNodes(object):
"""Class for getting the connected nodes from a list of nodes in a paged way"""
def __init__(self, list, query):
    # super(GetConnectedNodes, self).__init__()
    self.nodes = [ndb.model.Key('Node','%s' % x) for x in list]
    self.cursor = 0
    self.MAX_QUERY = 100
    # logging.info('Max query - %d' % self.MAX_QUERY)
    self.max_connections = len(list)
    self.connections = deque()
    self.query=query

def node_in_connected_nodes(self):
    """Checks if a node exists in the connected nodes of the next node in the 
       node list.
       Will return False if it doesn't, or the list of evidences for the connection
       if it does.
       """
    while self.cursor < self.max_connections:
        if len(self.connections) == 0:
            end = self.MAX_QUERY
            if self.max_connections - self.cursor < self.MAX_QUERY:
                end = self.max_connections - self.cursor
            self.connections.clear()
            self.connections = deque(ndb.model.get_multi_async(self.nodes[self.cursor:self.cursor+end]))

        connection = self.connections.popleft()
        connection_nodes = connection.get_result().connections

        if self.query in connection_nodes:
            connection_sources = connection.get_result().sources
            # yields (current node index in the list, sources)
            yield (self.cursor, connection_sources[connection_nodes.index(self.query)])
        self.cursor += 1

TutajNode ma powtarzającą się właściwośćconnections który zawiera tablicę z innymiNode identyfikatory kluczy i dopasowaniesources tablica do danego połączenia.

Uzyskane wyniki są przechowywane w blobstore.

Teraz pojawia się problem, że po iteracji funkcji połączenia pamięć nie jest jakoś usuwana. Poniższy dziennik pokazuje pamięć używaną przez AppEngine tuż przed utworzeniem nowegoGetConnectedNodes instancja:

I 2012-08-23 16:58:01.643 Prioritizing HGNC:4839 - mem 32
I 2012-08-23 16:59:21.819 Prioritizing HGNC:3003 - mem 380
I 2012-08-23 17:00:00.918 Prioritizing HGNC:8932 - mem 468
I 2012-08-23 17:00:01.424 Prioritizing HGNC:24771 - mem 435
I 2012-08-23 17:00:20.334 Prioritizing HGNC:9300 - mem 417
I 2012-08-23 17:00:48.476 Prioritizing HGNC:10545 - mem 447
I 2012-08-23 17:01:01.489 Prioritizing HGNC:12775 - mem 485
I 2012-08-23 17:01:46.084 Prioritizing HGNC:2001 - mem 564
C 2012-08-23 17:02:18.028 Exceeded soft private memory limit with 628.609 MB after servicing 1 requests total

Oprócz pewnych wahań pamięć po prostu rośnie, nawet jeśli nie uzyskano dostępu do żadnej z poprzednich wartości. Trudno mi było to debugować lub dowiedzieć się, czy gdzieś mam wyciek pamięci, ale wydaje mi się, że prześledziłem go aż do tej klasy. Byłbym wdzięczny za każdą pomoc.

questionAnswers(3)

yourAnswerToTheQuestion