2017-10-26 8 views
0

問題:MongoDbから一定の日に読んでいたい大量のトランザクションがあります。どのように日の価値を読むことを試みても、私の読書は常にストールします。ストールポイントは常に同じですが、バッチサイズの設定に基づいて変更することができます。Pymongo find()stalls

システム:Linuxのミント、Pythonの:3.5、MongoDBの3.2、PyMongo

コード:= { '$と' "クエリ" の

def write_transactions_to_file(start: datetime, end: datetime, filename: str): 
    print ("Writing transactions to file") 
    new_start = start 
    new_end = new_start + timedelta(hours=1) 

    with open(filename, 'w') as f: 
     while new_start < end: 
      print("Starting hour {}".format(new_start.hour)) 
      query = Builder().find(TimeStamp=Gt(new_start)).And(TimeStamp=Lt(new_end)).query 
      transactions = find(tx_collection, query) 

      for c, t in enumerate(transactions): 
       j = json.dumps(t, default=json_util.default) 
       f.write("{}\n".format(j)) 
       print("{}:{}".format(c,t)) 

      new_start=new_start+timedelta(hours=1) 
      new_end = new_start+timedelta(hours=1) 

    print("Transactions written to file") 

def find(self, collection, query): 
    return collection.find(query).batch_size(25) 

値:[{」 TimeStamp ':{' $ lt ':datetime.datetime(2017,10,24,0,0)}}、{' TimeStamp ':{' $ lt ':datetime.datetime(2017,10,24,1,0 )}}]}

試した: 元々、私は一日中質問しました。それは、ストールする前に16kレコードの周りに私を持っていた。私は後でバッチサイズを100に変更しました。それは、ストールする前に〜29kレコードまで私を得ました。次に、クエリを一度に1時間に制限しようとしました。あまりにも、(常に同じ場所)屋台。しかし、それが停止する点は、バッチサイズに基づいて異なります。

+0

「タイムスタンプ」フィールドにインデックスがありますか? –

+0

これは複合インデックスの一部ですが、スタンドアローンではありません。 – SteveJ

答えて

0

問題である可能性があり、物事のカップル:

  1. Timestampフィールドにインデックスが接頭辞でない場合(Compound Indexes: Prefixを参照)、それはクエリが効率的に実行されなかった可能性があります。クエリは大きくTimestampフィールドに依存するため、そのフィールドに基づいて別のインデックスを作成するか、フィールドが複合インデックスの最初に表示されるようにすることをお勧めします。

  2. あなたが見ているストールは、サーバーのメモリがいっぱいになっているため、ディスクからさらに多くのドキュメントを取得しようとしている可能性があります。このディスクアクセスを待つことは、ストールの可能性があります。この場合、iostatを使用して判断し、ストール期間がディスク使用率が高いかどうかを確認することができます。これは通常、サーバがSSDではなく回転ディスクを使用している場合に問題となります。