MongoDB与RethinkDB批量插入性能比较

2024-05-18 05:35:52 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我在这里的第一个正式问题;我欢迎对我的职位的任何/所有批评,以便我能够学习如何成为一个更好的公民。

我正在审查非关系数据库管理系统,以存储潜在的大型电子邮件选择退出列表,倾向于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的可用内存用于这些测试。


Tags: pytest脚本sizeifmongodbbatchcounter
3条回答

Pymongo开发者-如果您没有这样做,请确保您使用的是最新的Pymongo版本和MongoClientMongoRepicaSetClient,这样您的写作就得到了认可,而不是被解雇和遗忘。正如@Alex所说,它们很可能是你所需要的。

我需要考虑的其他问题是:这是数据库的主要用例还是核心难点?在做出决策之前,您可能需要考虑其他数据模式、查询数据、易用性和可维护性。

RethinkDB目前通过在服务器上一次执行一个插入来实现批插入。因为Rethink会将每个记录都刷新到磁盘(因为它是以安全性为第一考虑而设计的),所以这对像这样的工作负载有非常坏的影响。

我们要做两件事来解决这个问题:

  1. 批量插入将通过服务器上的批量插入算法实现,以避免一次插入一个。
  2. 如果您愿意的话,我们将为您提供放宽持久性限制的选项,以允许缓存内存吸收高吞吐量插入(以换取不经常与磁盘同步)。

这绝对会在4-12周内解决(如果您需要尽快解决,请随时给我发邮件至slava@rethingdb.com,我会看看是否可以重新排序)。

以下是相关的github问题:

https://github.com/rethinkdb/rethinkdb/issues/207

https://github.com/rethinkdb/rethinkdb/issues/314

希望这有帮助。如果你需要帮助,请不要犹豫给我们打电话。

撇开coffemug发布的内容不谈:

  1. 根据您使用的驱动程序版本以及如何配置到mongodb的连接,这些插入甚至可能不会被服务器确认。如果您使用的是最新版本的Python驱动程序,那么这些操作只是等待服务器的接收确认(这并不意味着数据已经写入内存)。有关我所指内容的更多详细信息,请查看Mongodb write concern setting

  2. 您可以通过并行化插入来加快Rethinkdb的速度。基本上,如果您运行多个进程/线程,您将看到速度在提高。在Mongo的情况下,由于所涉及的锁,并行性将不起作用。

也就是说,RethinkDB可以提高写入速度。

注:我正在努力重新思考,但以上几点是基于我对这两个系统的公正认识。

相关问题 更多 >