NDB не очищает память во время длинного запроса

В настоящее время я выгружаю долгосрочное задание в TaskQueue для расчета соединений между сущностями NDB в хранилище данных.

В основном эта очередь обрабатывает несколько списков ключей сущностей, которые должны быть связаны с другимиquery посредствомnode_in_connected_nodes функция вGetConnectedNodes узел:

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

ЗдесьNode имеет повторяющееся свойствоconnections который содержит массив с другимиNode ключевые идентификаторы и соответствующиеsources массив для данного соединения.

Полученные результаты хранятся в BLOB-магазине.

Теперь проблема, которую я получаю, состоит в том, что после итерации функции соединения память как-то не очищается. В следующем журнале показана память, используемая AppEngine непосредственно перед созданием новогоGetConnectedNodes пример:

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

Помимо некоторых колебаний, память просто продолжает увеличиваться, хотя ни одно из предыдущих значений не доступно. Мне было довольно сложно отладить это или выяснить, есть ли где-нибудь утечка памяти, но я, кажется, отследил ее до этого класса. Буду признателен за любую помощь.

Ответы на вопрос(2)

Ваш ответ на вопрос