NDB löscht den Speicher während einer langen Anforderung nicht

Ich lade gerade einen Auftrag mit langer Laufzeit in eine TaskQueue aus, um die Verbindungen zwischen NDB-Entitäten im Datenspeicher zu berechnen.

Grundsätzlich verarbeitet diese Warteschlange mehrere Listen von Entitätsschlüsseln, die mit anderen verknüpft werden sollenquery bis zumnode_in_connected_nodes Funktion in derGetConnectedNodes Knoten:

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

Hier einNode hat eine wiederholte Eigenschaftconnections das enthält ein Array mit anderenNode Schlüssel-IDs und ein Matchingsources Array zu dieser gegebenen Verbindung.

Die erhaltenen Ergebnisse werden in einem Blobstore gespeichert.

Das Problem, das ich jetzt bekomme, ist, dass nach einer Iteration der Verbindungsfunktion der Speicher nicht irgendwie gelöscht wird. Das folgende Protokoll zeigt den von AppEngine unmittelbar vor dem Erstellen eines neuen Speichers verwendeten SpeicherGetConnectedNodes Beispiel:

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

Abgesehen von einigen Schwankungen steigt der Speicher nur weiter an, obwohl auf keinen der vorherigen Werte zugegriffen wird. Ich fand es ziemlich schwierig, dies zu debuggen oder herauszufinden, ob ich irgendwo ein Speicherleck habe, aber ich scheine es auf diese Klasse zurückzuführen zu sein. Würde mich über jede Hilfe freuen.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage