現在、私はAmazon LinuxでEC2にMongoDBを設定しています。それは約1Mの文書を持っています。EC2がPythonを使用してMongoDBから大きなデータを照会していません
同じEC2上では、pymongo db.collection.find({}、{'attribute_1':1})を使用して、すべてのドキュメントのすべてのattribute_1を照会しました。
問題は、約200,000のドキュメントを反復して取得した後、私のPythonコードが機能しなくなることです。
エラーは表示されません(キャッチしようとしました)。 mongodbログにも、特定のエラーは表示されません。
私はEC2ネットワーク帯域幅のためにそれを非常に疑いますが、バッチごとに文書を分割して、1バッチあたり100,000の文書を作成しようとしました。そして、それはまだ動作しません。それは約20万の文書を自動的に壊すだけです。コードは以下の通りです:
count = db.collection.count()
page = int(ceil(count/100000.0))
result = []
i = 0
for p in range(0, page):
temp = db.collection.find({}, {'attribute_1':1})[p*100000:p*100000+100000]
for t in temp:
result.append(t['attribute_1'])
i = i+1
print i
私もEC2ログを試みましたが、何も変わっていません。 EC2は休憩後も正常に動作し続けました(私はまだコマンドライン、cd、lsなどにアクセスできました)。私のEC2インスタンスはc3.2xlargeです。私は現在、数日間このことに固執していましたが、何か助けていただければ幸いです。前もって感謝します。
更新:システムログを検索した後、私が見つかりました。これら:
Apr 22 10:12:53 ip-xxx kernel: [ 8774.975653] Out of memory: Kill process 3709 (python) score 509 or sacrifice child
Apr 22 10:12:53 ip-xxx kernel: [ 8774.978941] Killed process 3709 (python) total-vm:8697496kB, anon-rss:8078912kB, file-rss:48kB
私のEC2インスタンスが既に15ギガバイトのRAMを持っています。 Attribute_1はPythonの単語リストです。各Attribute_1はかなり多くの要素(単語)で構成されています。とにかくこの問題を解決するために私にはありますか?
データベースとpymongoクライアントが同じマシン上で動作している場合、帯域幅に問題はないはずです。ドキュメントのサイズはどれくらいですか?また、 'attribute_1'にはどんなタイプのデータがありますか? –
こんにちはSteve Rossiter、それは複数の単語からなるpythonリストです。私はちょうど私の質問を更新します、質問をもう一度見てください – Leo
問題は、あなたが非常に大きなpythonのリストを作成しているということです。データベースを持つ理由は、このデータをすべてメモリに保存する必要がないからです。複雑な集約を行う必要がある場合は、[集約フレームワーク](https://api.mongodb.org/python/current/api/pymongo/collection.html#pymongo.collection.Collection.aggregate)を使用して操作する必要がありますmongodbのデータ。 –