这是我在这里的第一个正式问题;我欢迎对我的职位的任何/所有批评,以便我能够学习如何成为一个更好的公民。
我正在审查非关系数据库管理系统,以存储潜在的大型电子邮件选择退出列表,倾向于MongoDB或RethinkDB,使用它们各自的Python客户端库。我的应用程序的难点是大容量插入性能,因此我设置了两个Python脚本,将20000条记录以5000个批次插入MongoDB集合和rethingdb集合。
MongoDB python脚本mongo_insert_test.py:
NUM_LINES = 20000
BATCH_SIZE = 5000
def insert_records():
collection = mongo.recips
i = 0
batch_counter = 0
batch = []
while i <= NUM_LINES:
i += 1
recip = {
'address': "test%d@test%d.com" % (i, i)
}
if batch_counter <= BATCH_SIZE:
batch.append(recip)
batch_counter += 1
if (batch_counter == BATCH_SIZE) or i == NUM_LINES:
collection.insert(batch)
batch_counter = 0
batch = []
if __name__ == '__main__':
insert_records()
几乎相同的RethinkDB python脚本rethink_insert_test.py:
NUM_LINES = 20000
BATCH_SIZE = 5000
def insert_records():
i = 0
batch_counter = 0
batch = []
while i <= NUM_LINES:
i += 1
recip = {
'address': "test%d@test%d.com" % (i, i)
}
if batch_counter <= BATCH_SIZE:
batch.append(recip)
batch_counter += 1
if (batch_counter == BATCH_SIZE) or i == NUM_LINES:
r.table('recip').insert(batch).run()
batch_counter = 0
batch = []
if __name__ == '__main__':
insert_records()
在我的开发环境中,MongoDB脚本在一秒钟内插入20000条记录:
$ time python mongo_insert_test.py
real 0m0.618s
user 0m0.400s
sys 0m0.032s
在相同的环境中,RethinkDB脚本的执行速度要慢得多,在2分钟内插入20000条记录:
$ time python rethink_insert_test.py
real 2m2.502s
user 0m3.000s
sys 0m0.052s
关于这两个DBMS的工作原理,我是否遗漏了一些重要的东西?为什么RethinkDB在这次测试中表现如此糟糕?
我的开发机器有大约1.2GB的可用内存用于这些测试。
Pymongo开发者-如果您没有这样做,请确保您使用的是最新的Pymongo版本和
MongoClient
或MongoRepicaSetClient
,这样您的写作就得到了认可,而不是被解雇和遗忘。正如@Alex所说,它们很可能是你所需要的。我需要考虑的其他问题是:这是数据库的主要用例还是核心难点?在做出决策之前,您可能需要考虑其他数据模式、查询数据、易用性和可维护性。
RethinkDB目前通过在服务器上一次执行一个插入来实现批插入。因为Rethink会将每个记录都刷新到磁盘(因为它是以安全性为第一考虑而设计的),所以这对像这样的工作负载有非常坏的影响。
我们要做两件事来解决这个问题:
这绝对会在4-12周内解决(如果您需要尽快解决,请随时给我发邮件至slava@rethingdb.com,我会看看是否可以重新排序)。
以下是相关的github问题:
https://github.com/rethinkdb/rethinkdb/issues/207
https://github.com/rethinkdb/rethinkdb/issues/314
希望这有帮助。如果你需要帮助,请不要犹豫给我们打电话。
撇开coffemug发布的内容不谈:
根据您使用的驱动程序版本以及如何配置到mongodb的连接,这些插入甚至可能不会被服务器确认。如果您使用的是最新版本的Python驱动程序,那么这些操作只是等待服务器的接收确认(这并不意味着数据已经写入内存)。有关我所指内容的更多详细信息,请查看Mongodb write concern setting
您可以通过并行化插入来加快Rethinkdb的速度。基本上,如果您运行多个进程/线程,您将看到速度在提高。在Mongo的情况下,由于所涉及的锁,并行性将不起作用。
也就是说,RethinkDB可以提高写入速度。
注:我正在努力重新思考,但以上几点是基于我对这两个系统的公正认识。
相关问题 更多 >
编程相关推荐