首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用python-arango升级性能ArangoDB

使用python-arango升级性能ArangoDB
EN

Stack Overflow用户
提问于 2021-06-08 00:35:25
回答 1查看 117关注 0票数 2

我正在使用paython-arango和aql查询对多个项目(大约20 - 30k)的UPSERT语句进行实验。总的来说,与NodeJS相比,python中的这种方法似乎要慢得多,但我尝试了两种不同的方法,令人惊讶的是,我认为它的速度要慢得多,我试图理解为什么。

我最初的方法是用下面这样的语句分别插入每一项:

代码语言:javascript
复制
        aql = "UPSERT {_key: '" + data["_key"] + "'}"
        aql += " INSERT " + doc
        aql += " UPDATE " + doc
        aql += " IN " + col_name
        
        self.db.aql.execute(aql)

正如我之前所说的,这比NodeJS中类似的NodeJS脚本要慢,可能是因为NodeJS异步工作。总共约45s für 27k个条目(2.4 MB csv-dump)。对于如此少的数据,需要大量的时间。

然后我想,一个接一个地可能是问题所在,最好是每个查询发送多个项目到数据库,如下所示:

代码语言:javascript
复制
        aql = "FOR itm IN " + json.dumps(items)
        aql += " UPSERT {_key: itm._key}"
        aql += " INSERT itm"
        aql += " UPDATE itm"
        aql += " IN " + col_name

但实际上,这是更糟糕的。可能需要5分钟,ArangoDB后端非常慢,而且在很短的一段时间内甚至无法访问。

我很好奇:为什么一个单独的(好的,我使用了2,10,50,100个项目的批次,但没有效果)的aql-statement with FOR比27k单独的请求要慢得多?我想不是这样的。有没有更好的方法来一次执行多个UPSERT(使用Python)?

它是一个Windows系统,有2个内核和16 GB的RAM。阅读表现很好,但写作...

EN

回答 1

Stack Overflow用户

发布于 2021-06-08 20:33:50

UPSERT执行嵌套查询以查找匹配的文档。然而,这并不能解释为什么单个查询的性能比多个查询差得多,当然,除非您异步/并行地执行这些查询。我将不得不更详细地研究这一点。

但是,由于您使用_key来标识文档,并且INSERTUPDATE语句看起来完全相同,因此最好将overwriteMode用于INSERT (请参阅https://www.arangodb.com/docs/stable/aql/operations-insert.html#query-options):

代码语言:javascript
复制
        aql = "FOR itm IN " + json.dumps(items)
        aql += " INSERT itm"
        aql += " IN " + col_name
        aql += " OPTIONS { overwriteMode: 'update' }"

但是,在处理大量文档时,您应该考虑使用同样支持overwriteMode的批量文档创建(https://www.arangodb.com/docs/stable/http/document-working-with-documents.html#create-multiple-documents)。但是,我不知道python-arango驱动程序是否支持这些函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67875501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档