Pymongo find()摊位

时间:2017-10-26 17:49:10

标签: mongodb python-3.x pymongo

问题:我想在一天内从MongoDb中读取大量交易。无论我如何阅读一天的价值,我的阅读总是停滞不前。失速点始终相同,但可以根据批量大小设置进行更改。

系统:Linux-Mint,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)

&#34;查询&#34;的价值= {&#39; $和&#39;:[{&#39; TimeStamp&#39;:{&#39; $ gt&#39;:datetime.datetime(2017,10,24,0,0)}} ,{&#39; TimeStamp&#39;:{&#39; $ lt&#39;:datetime.datetime(2017,10,24,1,0)}}]}

试过: 最初,我只是查询了一整天。在停止之前,这让我获得了大约16k的记录。后来我把批量大小改为100,在停止之前让我达到了~29k的记录。接下来,我尝试将查询限制为一次一小时。那也一直停滞(每次都是相同的地方)。但是,它停止的点根据批量大小而不同。

1 个答案:

答案 0 :(得分:0)

可能是一个问题:

  1. 如果Timestamp字段上的索引不是前缀(请参阅Compound Indexes: Prefix),那么查询可能无法有效执行。由于查询在很大程度上取决于Timestamp字段,因此建议根据该字段创建单独的索引,或者确保该字段首先出现在任何复合索引中。

  2. 您观察到的档位可能是由于服务器的内存填满,因此它试图从磁盘获取更多文档。等待磁盘访问可能是停顿。您可以使用iostat确定是否是这种情况,并查看停顿时段是否与磁盘利用率高相对应。如果您的服务器使用旋转磁盘而不是SSD,这通常是一个问题。