7

現在、長時間実行されるジョブを TaskQueue にオフロードして、データストア内の NDB エンティティ間の接続を計算しています。

基本的に、このキューは、ノード内の関数queryによって別のものに関連付けられるエンティティ キーのいくつかのリストを処理します。node_in_connected_nodesGetConnectedNodes

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

ここで、 aには、他のキー ID を持つ配列と、その特定の接続に一致する配列を含むNode繰り返しプロパティがあります。connectionsNodesources

生成された結果はブロブストアに保存されます。

今私が得ている問題は、接続機能の繰り返しの後、何らかの形でメモリがクリアされないことです。GetConnectedNodes次のログは、新しいインスタンスを作成する直前に AppEngine によって使用されたメモリを示しています。

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

いくつかの変動は別として、以前の値にアクセスしていなくても、メモリは増加し続けます。これをデバッグしたり、どこかにメモリリークがあるかどうかを判断したりするのは非常に難しいと思いましたが、そのクラスまでたどったようです。助けていただければ幸いです。

4

3 に答える 3

10

同様の問題がありました(長時間実行されるリクエストで)。デフォルトのndbキャッシュをオフにすることで解決しました。詳細については、こちらをご覧ください。

于 2012-08-24T11:50:09.217 に答える
-3

各リクエストの開始時に gc.collect() を呼び出すことができます。

于 2012-08-23T21:44:24.793 に答える