web-dev-qa-db-ja.com

allowDiskUse:Trueをpymongoと連携させることができません

Pymongoを使用したmongodb集計でaggregation result exceeds maximum document size (16MB)エラーが発生しています。

最初はlimit()オプションを使用してそれを克服することができました。ただし、ある時点で

_Exceeded memory limit for $group, but didn't allow external sort. Pass allowDiskUse:true to opt in." error.
_

では、_{'allowDiskUse':True}_オプションを使用します。このオプションは、コマンドラインで使用すると機能しますが、python code

_result = work1.aggregate(pipe, 'allowDiskUse:true')
_

TypeError: aggregate() takes exactly 2 arguments (3 given)エラーが発生します。 (これは http://api.mongodb.org/python/current/api/pymongo/collection.html#pymongo.collection.Collection.aggregate :aggregate(pipeline、 ** kwargs))。

私はrunCommandを使用しようとしました、またはそれはpymongoの同等物です:

_db.command('aggregate','work1',pipe, {'allowDiskUse':True})
_

しかし、「集計結果が最大ドキュメントサイズ(16MB)を超えています」エラーに戻ります

あなたが知る必要がある場合

_pipe = [{'$project': {'_id': 0, 'summary.trigrams': 1}}, {'$unwind': '$summary'}, {'$unwind': '$summary.trigrams'}, {'$group': {'count': {'$sum': 1}, '_id': '$summary.trigrams'}}, {'$sort': {'count': -1}}, {'$limit': 10000}]
_

ありがとうございました

18
David Makovoz

したがって、順番に:

  • aggregateはメソッドです。 2つの位置引数(self、暗黙的に渡されるpipeline)と任意の数のkeyword引数(_foo=bar_として渡す必要があります)を取ります-_=_記号がない場合は、キーワード引数ではありません)。つまり、result = work1.aggregate(pipe, allowDiskUse=True)を呼び出す必要があります。

  • 最大ドキュメントサイズに関するエラーは、Mongoに固有のものです。 Mongoは、16メガバイトを超えるドキュメント(またはその配列)を返すことはできません。データもコードも提供されていないので理由はわかりませんが、おそらく最終結果として作成しているドキュメントが大きすぎることを意味します。 _$limit_パラメータを減らしてみてください。まず、1に設定してテストを実行し、それを増やして、それを実行したときの結果の大きさを確認します。

43
Max Noel