NDB nicht löschen Speicher während einer langen Anfrage

Ich lade derzeit einen lang laufenden Job zu einer TaskQueue, um Verbindungen zwischen NDB-Entitäten im Datenspeicher zu berechnen.

Grundsätzlich behandelt diese Warteschlange mehrere Listen von Entity-Schlüsseln, die mit einer anderen query durch die Funktion node_in_connected_nodes im GetConnectedNodes Knoten GetConnectedNodes werden sollen:

 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 hat ein Node eine wiederholte Eigenschaftsverbindung, die ein Array mit anderen Node Schlüssel-IDs enthält, und ein passendes sources Array zu dieser gegebenen Verbindung.

Die erbrachten Ergebnisse werden in einem Blobstore gespeichert.

Jetzt ist das Problem, das ich bekomme, dass nach einer Iteration der Verbindungsfunktion der Speicher nicht irgendwie gelöscht wird. Das folgende Protokoll zeigt den Speicher an, der von AppEngine verwendet wird, kurz bevor eine neue GetConnectedNodes Instanz erstellt wird:

 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 an, obwohl keiner der bisherigen Werte zugegriffen wird. Ich fand es ganz schwer, das zu debuggen oder herauszufinden, ob ich irgendwo ein Gedächtnisleck habe, aber ich scheine es auf diese Klasse zurückzuführen zu haben. Würde schätzen jede Hilfe.

3 Solutions collect form web for “NDB nicht löschen Speicher während einer langen Anfrage”

Wir hatten ähnliche Probleme (mit lang laufenden Anfragen). Wir haben sie gelöst, indem wir den Standard-ndb-Cache ausschalten. Hier können Sie mehr darüber erfahren

In unserem Fall wurde dies durch AppEngine Appstats aktiviert.

Nach dem Deaktivieren ist der Speicherverbrauch wieder normal.

Sie können gc.collect () am Anfang jeder Anfrage anrufen.

Python ist die beste Programmiersprache der Welt.