njy*_*nis 25 python mongodb nosql python-2.7 rethinkdb
这是我在这里的官方第一个问题; 我欢迎任何/所有批评我的帖子,以便我可以学习如何成为一个更好的SO公民.
我正在审查非关系型DBMS,用于存储潜在的大型电子邮件退出列表,使用各自的Python客户端库,倾向于使用MongoDB或RethinkDB.我的应用程序的痛点是批量插入性能,因此我设置了两个Python脚本,将批量为5,000的20,000条记录插入到MongoDB和RethinkDB集合中.
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()
Run Code Online (Sandbox Code Playgroud)
几乎相同的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()
Run Code Online (Sandbox Code Playgroud)
在我的开发环境中,MongoDB脚本在一秒钟内插入20,000条记录:
$ time python mongo_insert_test.py
real 0m0.618s
user 0m0.400s
sys 0m0.032s
Run Code Online (Sandbox Code Playgroud)
在相同的环境中,RethinkDB脚本执行速度要慢得多,在2分钟内插入20,000条记录:
$ time python rethink_insert_test.py
real 2m2.502s
user 0m3.000s
sys 0m0.052s
Run Code Online (Sandbox Code Playgroud)
关于这两个DBMS如何工作,我是否遗漏了一些巨大的东西?为什么RethinkDB在这个测试中表现如此糟糕?
我的开发机器有大约1.2GB的可用内存用于这些测试.
cof*_*mug 47
RethinkDB目前通过在服务器上一次执行一次插入来实现批量插入.由于Rethink将每个记录刷新到磁盘(因为它的设计首先考虑了安全性),这对像这样的工作负载会产生非常糟糕的影响.
我们正在做两件事来解决这个问题:
这将在4-12周内完全修复(如果你需要这个,请随时给我发一封电子邮件给slava@rethinkdb.com,我会看看我们是否可以重新优先考虑).
以下是相关的github问题:
https://github.com/rethinkdb/rethinkdb/issues/207
https://github.com/rethinkdb/rethinkdb/issues/314
希望这可以帮助.如果您需要帮助,请随时与我们联系.
撇开coffemug发布的内容:
根据您使用的驱动程序版本以及如何配置与mongodb的连接,服务器甚至可能无法确认这些插入.如果您使用的是最新版本的Python驱动程序,那些操作只是等待来自服务器的收据确认(这并不意味着数据甚至已写入内存).有关我所指的内容的更多详细信息,请查看Mongodb写入关注设置
通过并行化插入,你可以在Rethinkdb的情况下加快速度.基本上,如果你运行多个进程/线程,你会看到速度上升.在Mongo的情况下,由于涉及锁定,并行性将无济于事.
话虽如此,RethinkDB可以提高写入速度.
PS:我正在为Rethink工作,但以上几点是基于我对这两个系统的公正知识.
归档时间: |
|
查看次数: |
11765 次 |
最近记录: |