0

Python を介して MongoDB から大量の結果をクエリしようとしています。ツリーのような構造で孫のようなものを取得したいので、JavaScript を使用してこれを行います。私のコードは次のようになります。

col = db.getCollection(...)
var res = new Array();
col.find( { "type" : ["example"] } ).forEach(
  function(entry) 
  {
    v1 = col.find( {"_id" : entry["..."]} )
    ... (walk through the structure) ...
    vn = ...
    res.push([v1["_id"], vn["data"]]);
  } 
);         
return res;

今、結果の配列が非常に(大きすぎて)大きくなり、メモリを超えてしまうという問題があります。結果を配列にプッシュする代わりに結果を生成する方法はありますか?

4

2 に答える 2

0

わかりました、私はあなたが何を意味するか知っていると思います。次のような構造を作成しました。

var bulksize = 1000;
var col = db.getCollection("..");       
var queryRes = col.find( { ... } )

process = function(entity) { ... }

nextEntries = function()
{
  var res = new Array();
  for(var i=0; i<bulksize; i++)
  {            
    if(hasNext())
      res.push(process(queryRes.next()));
    else
      break;
  }  
  return res;
}

hasNext = function()
{
  return queryRes.hasNext();
}

このスクリプトは、結果を 1000 エントリのバルクに分割します。Python 側から、上記のスクリプトを評価してから、次のことを行います。

while database.eval('hasNext()'):
    print "test"
    for res in database.eval('return nextEntries()'):
        doSth(res)

興味深いことに、コンソールには常に次のように表示されます。

test
test
test
test
test
test

次に、エラーが発生します。

pymongo.errors.OperationFailure: command SON([('$eval', Code('return nextEntries()', {})), ('args', ())]) failed: invoke failed: JS Error: ReferenceError: nextEntries is not defined nofile_a:0

つまり、 nextEntries() の最初の呼び出しは機能しますが、関数はもう存在しません。MongoDB が JavaScript キャッシュのクリアのようなことをするのではないでしょうか? 問題はバルクサイズに依存しません (10、100、1000、10000 でテストされ、常に同じ結果が得られます)。

于 2013-03-04T12:44:04.400 に答える
0

よし、MongoDB のソース コードで、10 回以上使用されたすべての JavaScript をクリアする行を見つけた。そのため、データベース サーバーに変更を加えたくない場合は、データベースに複数回クエリを実行し、skip() および limit() 関数を使用してアイテムの量を選択して、クライアントにバルクを送信する必要があります。これは驚くほど速く動作します。ご協力いただきありがとうございます。

于 2013-03-06T13:09:22.020 に答える