这是我在这里的正式第一个问题;我欢迎任何/所有对我的帖子的批评,以便我可以学习如何成为一个更好的 SO 公民。
我正在审查非关系 DBMS 以存储潜在的大型电子邮件退出列表,倾向于 MongoDB 或 RethinkDB,使用它们各自的 Python 客户端库。我的应用程序的痛点是批量插入性能,因此我设置了两个 Python 脚本以将 20,000 条记录分批插入 5,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()
几乎相同的 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 脚本在一秒钟内插入 20,000 条记录:
$ time python mongo_insert_test.py
real 0m0.618s
user 0m0.400s
sys 0m0.032s
在相同的环境下,RethinkDB 脚本的执行速度要慢得多,在 2 分钟内插入 20,000 条记录:
$ time python rethink_insert_test.py
real 2m2.502s
user 0m3.000s
sys 0m0.052s
关于这两个 DBMS 的工作方式,我在这里是否遗漏了一些重要的东西?为什么 RethinkDB 在这个测试中表现如此糟糕?
我的开发机器有大约 1.2GB 的可用内存用于这些测试。