问题:我想在一天内从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的记录。接下来,我尝试将查询限制为一次一小时。那也一直停滞(每次都是相同的地方)。但是,它停止的点根据批量大小而不同。
答案 0 :(得分:0)
可能是一个问题:
如果Timestamp
字段上的索引不是前缀(请参阅Compound Indexes: Prefix),那么查询可能无法有效执行。由于查询在很大程度上取决于Timestamp
字段,因此建议根据该字段创建单独的索引,或者确保该字段首先出现在任何复合索引中。
您观察到的档位可能是由于服务器的内存填满,因此它试图从磁盘获取更多文档。等待磁盘访问可能是停顿。您可以使用iostat
确定是否是这种情况,并查看停顿时段是否与磁盘利用率高相对应。如果您的服务器使用旋转磁盘而不是SSD,这通常是一个问题。