运行 大型 AQL 查询内存不足 |试图将一个集合分成两部分
Running out of RAM on large AQL query | Trying to split a collection into two
为了解决我的问题 ,我使用 ArangoDb 的 AQL 语言将一个集合一分为二。因为只能在 "normalized" 集合上创建图表。但是我的查询占用了我所有的 RAM (16gb)。
FOR comment IN collection_name
COLLECT author = comment.author
, subreddit = comment.subreddit
WITH COUNT INTO counter
RETURN {author, counter, subreddit}
有没有一种方法可以将结果直接转储到磁盘而无需将其拉入 RAM?或者我可以不使用查询直接拆分它的方法?
这里的问题是,COLLECT
语句在内存中有效。由于您的 collection 有 4000 万份文件,而您想要处理所有这些文件,而他们提供 72.424.492 个 uniq 项目来收集,这将无法解决。
要创建您希望创建的子集 collection,
可以使用 OPTIONS { ignoreErrors: true }
创建此子集。
由于您的 author
字段可能包含 _key
字段中不允许的字符串(我们需要使用 ignoreErrors
选项识别并跳过重复项),您可以使用 MD5()
为每个作者创建一个 _key
uniq。为每个 uniq 作者创建一个作者条目的结果查询可能如下所示:
db._query(`
FOR item IN RawSubReddits
INSERT {
_key: MD5(item.author),
author: item.author
} INTO authors
OPTIONS { ignoreErrors: true }`);
一旦你有了这些,你就可以从边缘更新计数 collection:
db._query(`
FOR onesubred IN RawSubReddits
INSERT {
_from: CONCAT('authors/', MD5(onesubred.author)),
_to: CONCAT('RawSubReddits/', onesubred._key)
} INTO authorsToSubreddits")
This post github 可以提供更多信息。
为了解决我的问题
FOR comment IN collection_name
COLLECT author = comment.author
, subreddit = comment.subreddit
WITH COUNT INTO counter
RETURN {author, counter, subreddit}
有没有一种方法可以将结果直接转储到磁盘而无需将其拉入 RAM?或者我可以不使用查询直接拆分它的方法?
这里的问题是,COLLECT
语句在内存中有效。由于您的 collection 有 4000 万份文件,而您想要处理所有这些文件,而他们提供 72.424.492 个 uniq 项目来收集,这将无法解决。
要创建您希望创建的子集 collection,
可以使用 OPTIONS { ignoreErrors: true }
创建此子集。
由于您的 author
字段可能包含 _key
字段中不允许的字符串(我们需要使用 ignoreErrors
选项识别并跳过重复项),您可以使用 MD5()
为每个作者创建一个 _key
uniq。为每个 uniq 作者创建一个作者条目的结果查询可能如下所示:
db._query(`
FOR item IN RawSubReddits
INSERT {
_key: MD5(item.author),
author: item.author
} INTO authors
OPTIONS { ignoreErrors: true }`);
一旦你有了这些,你就可以从边缘更新计数 collection:
db._query(`
FOR onesubred IN RawSubReddits
INSERT {
_from: CONCAT('authors/', MD5(onesubred.author)),
_to: CONCAT('RawSubReddits/', onesubred._key)
} INTO authorsToSubreddits")
This post github 可以提供更多信息。