gpt4 book ai didi

arangodb - 大量插入杀死了 arangod(好吧,几乎)

转载 作者:行者123 更新时间:2023-12-02 21:19:57 24 4
gpt4 key购买 nike

我想知道有人遇到过这种情况:

通过 AQL 插入文档时,我可以轻松终止我的 arango 服务器。例如

FOR i IN 1 .. 10
FOR u IN users
INSERT {
_from: u._id,
_to: CONCAT("posts/",CEIL(RAND()*2000)),
displayDate: CEIL(RAND()*100000000)
} INTO canSee

(其中用户包含 500000 个条目),会发生以下情况

  • canSee 完全锁定(也无法再读取)
  • 内存消耗增加
  • arangosh 或 Web 控制台变得无响应
  • 失败 [ArangoError 2001:无法连接]
  • 服务器仍在运行,访问集合超时
  • 服务器恢复大约需要 5-10 分钟,我才能再次访问该集合
  • 访问任何其他集合都可以正常工作

好吧,我正在创建大量条目,AQL 可能会以批量执行此操作的方式实现。通过 db.save 方法进行写入时,它可以工作,但速度要慢得多。

此外,我怀疑这可能与预写缓存填满有关。

但是,有办法解决这个问题吗?向数据库写入大量条目并不一定会杀死它。

日志说

DEBUG [./lib/GeneralServer/GeneralServerDispatcher.h:411] shutdownHandler called, but no handler is known for task

DEBUG [arangod/VocBase/datafile.cpp:949] created datafile '/usr/local/var/lib/arangodb/journals/logfile-6623368699310.db' of size 33554432 and page-size 4096

DEBUG [arangod/Wal/CollectorThread.cpp:1305] closing full journal '/usr/local/var/lib/arangodb/databases/database-120933/collection-4262707447412/journal-6558669721243.db'

最佳

最佳答案

上述查询将在单个事务中将 5M 文档插入到 ArangoDB 中。这将需要一段时间才能完成,并且当事务仍在进行时,它将在内存中保存大量(可能需要的)回滚数据。

此外,上述查询将首先构建要插入内存中的所有文档,完成后将开始插入它们。构建所有文档也会消耗大量内存。执行此查询时,您将看到内存使用量稳步增加,直到实际插入开始时磁盘写入才会开始。

至少有两种方法可以改善这一点:

  • 将查询拆分为多个较小的事务可能会有所帮助。这样,每一笔交易就不会像原始交易那么大,并且在进行时也不会阻塞那么多系统资源。

  • 对于上面的查询,从技术上讲,没有必要先构建所有文档以插入内存,然后才将它们全部插入。相反,从用户读取的文档可以在到达时插入到canSee中。这不会加快查询速度,但会显着降低查询执行期间对于如上所述大的结果集的内存消耗。它还将导致写入立即开始,从而提前开始预写日志收集。并非所有查询都适合此优化,但有些查询(包括上述查询)适合。我今天研究了一种机制,可以检测合格的查询并以这种方式执行它们。该更改已于今天推送到开发分支,并将在 ArangoDB 2.5 中提供。

关于arangodb - 大量插入杀死了 arangod(好吧,几乎),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28322579/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com