pymongo单插入太慢,尽管WriteConcern(w = 0)

时间:2017-11-14 12:06:44

标签: python mongodb performance time pymongo

我正在使用pymongo写给我的mongodb。 我希望尽可能快的性能,所以我将写入关注设置为w = 0。我试过三种方法:

1

client = MongoClient(host=HOST, port=PORT, w=0)
collection = client[DB][COLLECTION]
collection.insert_one(data)

2

client = MongoClient(host=HOST, port=PORT)
collection = collection.with_options(write_concern=WriteConcern(w=0))
collection = client[DB][COLLECTION]
collection.insert_one(data)

3

client = MongoClient(host=HOST, port=PORT)
collection = client[DB][COLLECTION]
collection.insert_one(data, bypass_document_validation=True)

在上述所有尝试中,collection.insert_one()花费的时间约为0.5秒(!)

为什么插入仍然需要这么长时间?

据我所知,至少应该是大约五分之一的时间。更重要的是,'数据'不是很多数据,只有少数项目。我正在使用mongodb 3.4和pymongo 3.0

2 个答案:

答案 0 :(得分:1)

首先,你需要回答“速度有多快”。

“慢”和“快”是非常主观的术语。这取决于很多因素,包括配置的服务器,您正在使用的语言,您要插入的文档,您在集合中定义的索引数量,以及您的预期。

对于某些人来说,“慢”是> 100毫秒。对于其他人,“慢”是> 10ms。当然,您想要获得“更快”的结果,在服务器配置方面花费的成本会更高。

另一方面,Python并不是最快的语言。众所周知,在使用Global Interpreter Lock方面存在局限性。它也是一种解释性语言,主要是为了可读性而不是纯粹的速度。通常可以使用编译语言(C,C ++等)立即加速提升

您可以尝试的另一件事是使用批量插入,而不是尝试使用insert_one()插入许多文档。有关使用批量插入的示例,请参阅http://api.mongodb.com/python/current/examples/bulk.html#bulk-insert

答案 1 :(得分:0)

除非您正在运行集群,否则

w=0将无济于事。 [1]

co = co.with_options(write_concern=WriteConcern(w=0, j=False, fsync=False))为我大大加快了速度,但请确保您了解后果。使用insert_many加快速度可能更好(特别是如果您的mongodb服务器在网络上)。

编辑:实际上可能是fl幸-一段时间后速度变慢。

[1] https://api.mongodb.com/python/current/api/pymongo/write_concern.html#pymongo.write_concern.WriteConcern