【发布时间】:2021-08-24 18:24:23
【问题描述】:
我正在使用 paython-arango 和 aql 查询对多个项目(大约 20 - 30k)进行 UPSERT 语句试验。总的来说,与 NodeJS 相比,这种方法在 python 中似乎要慢得多,但我尝试了两种不同的方法,令人惊讶的是,我认为它更快的方法要慢得多,我试图理解为什么。
我最初的方法是用这样的语句单独更新每个项目:
aql = "UPSERT {_key: '" + data["_key"] + "'}"
aql += " INSERT " + doc
aql += " UPDATE " + doc
aql += " IN " + col_name
self.db.aql.execute(aql)
正如我之前所说,这比 NodeJS 中的类似 NodeJS 脚本要慢,这可能是因为 NodeJS 是异步工作的。总共大约 45 秒 für 27k 条目(2.4 MB csv-dump)。这么少的数据花了很多时间。
然后我想,一个接一个可能是问题所在,最好将每个查询的多个项目发送到数据库,如下所示:
aql = "FOR itm IN " + json.dumps(items)
aql += " UPSERT {_key: itm._key}"
aql += " INSERT itm"
aql += " UPDATE itm"
aql += " IN " + col_name
但实际上,情况更糟。大概 5 分钟,ArangoDB-Backend 的速度非常慢,并且在短时间内甚至无法访问。
我很好奇:为什么一个单独的(好吧,我使用了 2、10、50、100 个项目但没有效果的批次)aql 语句与 FOR 比 27k 单独请求慢得多?我预计不是这样。有没有更好的方法一次执行多个 UPSERT(使用 Python)?
它是一个具有 2 个内核和 16 GB RAM 的 Windows 系统。阅读成绩不错,但写作……
【问题讨论】:
标签: python arangodb python-arango