2016-04-22 3 views
0

現在、私は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はかなり多くの要素(単語)で構成されています。とにかくこの問題を解決するために私にはありますか?

+1

データベースとpymongoクライアントが同じマシン上で動作している場合、帯域幅に問題はないはずです。ドキュメントのサイズはどれくらいですか?また、 'attribute_1'にはどんなタイプのデータがありますか? –

+0

こんにちはSteve Rossiter、それは複数の単語からなるpythonリストです。私はちょうど私の質問を更新します、質問をもう一度見てください – Leo

+0

問題は、あなたが非常に大きなpythonのリストを作成しているということです。データベースを持つ理由は、このデータをすべてメモリに保存する必要がないからです。複雑な集約を行う必要がある場合は、[集約フレームワーク](https://api.mongodb.org/python/current/api/pymongo/collection.html#pymongo.collection.Collection.aggregate)を使用して操作する必要がありますmongodbのデータ。 –

答えて

1

非常に大きなリストresultを作成しているようで、インスタンス内の使用可能なメモリを超えています。一般的にこれは、必要なデータのみがPythonで処理されるようにシステムの一部を再設計する必要があることを示します。いくつかのオプション:

  • cursorを返すfind pymongo年代 - で多分あなたは実際にすべての
  • プロセスが挿入されるとデータに関する情報や店舗のリストを必要としない別のコレクション
  • 使用するクエリそしてaggregationは、必要な形式でDBから必要なものを戻すこと
  • スプリット複数のマシン間で処理

他にもアプローチがありますが、このようなエラーはあなたに「このデータをすべてPythonリストに必要としますか?

+0

問題を解決するためのあなたの明確な答えとガイダンスのために@ Steve Rossiterに感謝します! – Leo

関連する問題