我想知道有没有人遇到过这个:
通过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个条目),发生以下情况
好吧,我正在创建大量条目,而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'
最好成绩
答案 0 :(得分:4)
上述查询将在单个事务中将5M文档插入ArangoDB。这将需要一段时间才能完成,并且在事务仍在进行时,它将在内存中保存大量(可能需要的)回滚数据。
此外,上述查询将首先构建要插入内存的所有文档,一旦完成,将开始插入它们。构建所有文档也会消耗大量内存。执行此查询时,您将看到内存使用量稳步增加,直到某些时候磁盘写入将在实际插入开始时启动。
至少有两种方法可以改善这种情况:
将查询拆分为多个较小的事务可能会有所帮助。然后,每笔交易都不会像原始交易一样大,并且在进行中不会阻止那么多系统资源。
在技术上并不需要首先将所有文档构建到内存中,然后才将它们全部插入。相反,从users
读取的文档可能会在到达时插入canSee
。这不会加快查询速度,但是在结果集的查询执行期间,它将显着降低内存消耗。它还将导致写入立即开始,从而提前开始写入日志收集。并非所有查询都符合此优化条件,但有些(包括上述内容)是。我今天在一个机制上工作,检测符合条件的查询并以这种方式执行它们。这一变化今天被推入了devel分支,并将随ArangoDB 2.5一起提供。