gpt4 book ai didi

Python + MongoDB - 游标迭代太慢 - 未解决?

转载 作者:可可西里 更新时间:2023-11-01 10:33:00 28 4
gpt4 key购买 nike

我有一个数据库查找查询,它返回 150k 个文档,其中每个文档包含三个整数字段和一个日期时间字段。以下代码尝试从游标对象创建列表。迭代光标非常慢——大约 80 秒!通过 C++ 驱动程序执行相同的操作要快几个数量级——这一定是 PyMongo 的问题?

client = MongoClient()
client = MongoClient('localhost', 27017)
db = client.taq
collection_str = "mycollection"
db_collection = db[collection_str]

mylist = list(db_collection.find())

之前已经讨论过这个问题,我尝试了这些建议。一种是更改默认批量大小。所以我尝试了以下方法:

cursor = db_collection.find()
cursor.bath_size(10000)
mylist = list(cursor)

但是,这没有任何影响。第二个建议是检查是否安装了 C 扩展——我已经安装了它们,所以这不是问题所在。 Mongo 数据库安装在同一台机器上,因此它不是网络问题 - 它在 C++ 中工作正常......从 Pymongo 查询是问题所在。

既然 MongoDB 被宣传为能够处理大数据,那么肯定有一种方法可以通过 Python 快速检索数据吗?之前已经提出过这个问题,但我还没有找到解决方案....有没有人有可行的建议?在这种情况下,我要检索 150k 个文档,但通常查询会检索 100 万个文档,所以这对我来说将是一个真正的问题。

谢谢。

最佳答案

我无法复制 - 我正在加载 150k 文档并在 ~0.5 > ~0.8 秒内转换为列表。以下是 timeit 测试脚本的结果 - 以秒为单位将 150,000 个文档从数据库转换为列表。

--------------------------------------------------
Default batch size
0.530369997025
--------------------------------------------------
Batch Size 1000
0.570069074631
--------------------------------------------------
Batch Size 10000
0.686305046082

这是我的测试脚本:

#!/usr/bin/env python

import timeit

def main():
"""
Testing loading 150k documents in pymongo
"""

setup = """
import datetime
from random import randint
from pymongo import MongoClient
connection = MongoClient()
db = connection.test_load
sample = db.sample
if db.sample.count() < 150000:
connection.drop_database('test_load')

# Insert 150k sample data
for i in xrange(15000):
sample.insert([{"date": datetime.datetime.now(),
"int1": randint(0, 1000000),
"int2": randint(0, 1000000),
"int4": randint(0, 1000000)} for i in xrange(10)])

"""

stmt = """
from pymongo import MongoClient
connection = MongoClient()

db = connection.test_load
sample = db.sample

cursor = sample.find()
test = list(cursor)
assert len(test) == 150000
"""

print "-" * 100
print """Default batch size"""
t = timeit.Timer(stmt=stmt, setup=setup)
print t.timeit(1)

stmt = """
from pymongo import MongoClient
connection = MongoClient()

db = connection.test_load
sample = db.sample

cursor = sample.find()
cursor.batch_size(1000)
test = list(cursor)
assert len(test) == 150000
"""

print "-" * 100
print """Batch Size 1000"""
t = timeit.Timer(stmt=stmt, setup=setup)
print t.timeit(1)

stmt = """
from pymongo import MongoClient
connection = MongoClient()

db = connection.test_load
sample = db.sample

cursor = sample.find()
cursor.batch_size(10000)
test = list(cursor)
assert len(test) == 150000
"""

print "-" * 100
print """Batch Size 10000"""
t = timeit.Timer(stmt=stmt, setup=setup)
print t.timeit(1)

if __name__ == "__main__":
main()

我很困惑你是怎么得到 80 秒而不是 0.8 秒的!我根据您的定义创建了示例数据 - 这与您的定义有何不同?

关于Python + MongoDB - 游标迭代太慢 - 未解决?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18383761/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com