- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我敢肯定有一种简单快捷的方法可以做到这一点,但它却在逃避我。我有一个包含一些重复记录的大型数据集,我想摆脱这些重复记录。 (重复项由一个属性唯一标识,但文档的其余部分也应相同)。
我试图创建一个新集合,该集合仅以几种不同的方式具有唯一值,但它们的运行速度都很慢。例如:
FOR doc IN Documents
COLLECT docId = doc.myId, doc2 = doc
INSERT doc2 IN Documents2
FOR doc IN Documents
LET existing = (FOR doc2 IN Documents2
FILTER doc.myId == doc2.myId
RETURN doc2)
UPDATE existing WITH doc IN Documents2
FOR doc IN Documents
UPSERT {myId: doc.myId}}]}
INSERT doc
UPDATE doc IN Documents2
最佳答案
TL; DR
至少在我的台式机(Windows 10,Intel 6700K 4x4.0GHz,32GB RAM,Evo 850 SSD)上,不需要花费很长时间即可对记录进行重复数据删除并将其写入另一个集合(少于60秒)。
但是,某些查询需要正确的索引编制,否则它们将永远存在。索引需要一些内存,但与查询执行中用于对记录进行分组所需的内存相比,它可以忽略不计。如果内存不足,则性能会受到影响,因为操作系统需要在内存和大容量存储之间交换数据。对于旋转磁盘而言,这尤其是一个问题,而对于快速闪存存储设备则不那么重要。
制备
我生成了220万条记录,这些记录具有5-20个随机属性,每个属性有160个字符的乱码。此外,每个记录都有一个属性myid
。 187k条记录具有唯一ID,60k myid
存在两次,70k次存在3次。报告的集合大小为4.83GB:
// 1..2000000: 300s
// 1..130000: 20s
// 1..70000: 10s
FOR i IN 1..2000000
LET randomAttributes = MERGE(
FOR j IN 1..FLOOR(RAND() * 15) + 5
RETURN { [CONCAT("attr", j)]: RANDOM_TOKEN(160) }
)
INSERT MERGE(randomAttributes, {myid: i}) INTO test1
test1
源集合后的内存消耗约为8.8GB。
test1
读取并将所有文档(2.2m)插入
test2
在我的系统上花费了20s,内存峰值约为17.6GB:
FOR doc IN test1
INSERT doc INTO test2
myid
分组而不写,大约需要花费时间。对我来说是9s,在查询过程中RAM峰值为9GB:
LET result = (
FOR doc IN test1
COLLECT myid = doc.myid
RETURN 1
)
RETURN LENGTH(result)
COLLECT docId = doc.myId, doc2 = doc
的数据集尝试了您的
myid
方法。它表明查询实际上并未将重复项分组/删除。因此,我试图找到其他查询。
myid
分组在一起,但保留访问完整文档的可能性,可以使用
COLLECT ... INTO
。我只是选择了每个组的第一个文档来删除多余的
myid
。将2m条具有唯一
myid
属性的记录写入到
test2
的查询大约需要40秒钟的时间。我没有准确测量内存消耗,但是我看到了从14GB到21GB的不同内存峰值。可能由于某些陈旧的条目以某种方式(压缩/密钥生成)而阻塞了,所以删节测试集合并重新运行查询会增加所需的内存吗?
FOR doc IN test1
COLLECT myid = doc.myid INTO groups
INSERT groups[0].doc INTO test2
FOR doc IN test1
COLLECT myid = doc.myid
LET doc2 = (
FOR doc3 IN test1
FILTER doc3.myid == myid
LIMIT 1
RETURN doc3
)
INSERT doc2[0] INTO test2
myid
中
test1
上的哈希索引才能实现〜38s的查询执行时间。否则,子查询将导致数百万次集合扫描,并且需要花费一定时间。
_id
分配给变量,然后将其分配给
KEEP
,而不是将所有文档归为一组,这样我们就可以使用
DOCUMENT()
查找文档正文:
FOR doc IN test1
LET d = doc._id
COLLECT myid = doc.myid INTO groups KEEP d
INSERT DOCUMENT(groups[0].d) INTO test2
FOR doc IN test1
COLLECT myid = doc.myid INTO groups = doc._id
INSERT DOCUMENT(groups[0]) INTO test2
test1
后,RAM为8.3GB,峰值为17.8GB(在查询执行过程中实际上有两个高峰,两个都超过17GB)。 200万张唱片用了35秒钟完成。
FOR doc IN test1
UPSERT {myid: doc.myid}
INSERT doc
UPDATE {} IN test2
myid
中的
test2
上使用(唯一)哈希索引处理需要40秒钟,RAM峰值约为13.2GB。
test1
复制到
test2
(2.2m条记录),然后尝试
REMOVE
仅复制
test2
中的副本:
FOR doc IN test2
COLLECT myid = doc.myid INTO keys = doc._key
LET allButFirst = SLICE(keys, 1) // or SHIFT(keys)
FOR k IN allButFirst
REMOVE k IN test2
test2
),在查询过程中高达13.5GB。删除副本大约需要16秒钟(200k)。
myid
分组在一起,并汇总每个ID出现的频率。针对目标集合
test2
运行,结果应为
{"1": 2000000}
,否则仍存在重复项。我仔细检查了上面的查询结果,并检查了所有内容。
FOR doc IN test2
COLLECT myid = doc.myid WITH COUNT INTO count
COLLECT c = count WITH COUNT INTO cc
RETURN {[c]: cc}
关于arangodb - 对ArangoDB文档集合进行重复数据删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37704101/
我无法停止 arangodb docker 容器中的 arangodb 服务器。 当我执行低于一个时, $/etc/init.d/arangod 停止 $service arangodb 状态 ara
我在 java 中查询 ArangoDB 以获取数组值时遇到问题。我尝试过使用 String[] 和 ArrayList,都没有成功。 我的查询: FOR document IN documents
我想计算 ArangoDB 的服务器要求。 我知道 ArangoDB 将索引存储在 RAM 中,但是索引使用了多少空间? 最佳答案 这取决于您使用的索引类型。 您可以使用“数字”来查看需要多少内存:
我是 Arango DB 的新用户,目前正在为我的项目评估它。有人可以告诉我,您可以在 Arango DB 中创建的最大数据库数量是多少吗? 谢谢。 最佳答案 据我所知,ArangoDB 中的数据库数
我尝试从我的电脑连接到位于另一台服务器上的 ArangoDB,但似乎不成功。然后,我尝试使用输入服务器 ip http://x.x.x.x:8529 提供的 Web UI 来访问它。但也失败了。我在本
我有一个这样的文件: { "baths": 2, "beds": 3, "id": "3225C", "addrs": [ { "line2": "",
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
检索相关edge_collection中没有边的所有顶点的最佳方法是什么 我尝试使用以下代码,但自 arangodb 2.8 以来,它变得非常慢(在以前的版本中并不是很快,但比现在快了大约 10 倍)
我有许多节点通过其他类型的中间节点连接。如图所示,中间节点可以有多个。我需要找到给定数量的节点的所有中间节点,并按初始节点之间的链接数量对其进行排序。在我的示例中,给定 A、B、C、D,它应该返回节点
我有一个存储在 arangodb 中的对象,该对象具有其他内部对象,我当前的用例要求我仅更新其中一个元素。 存储对象 { "status": "Active", "physicalCode":
我正在尝试与 Arango 组合一个单元测试设置。为此,我需要能够在每次测试时重置测试数据库。 我知道我们可以直接从 REST API 删除数据库,但文档中提到创建和删除可能“需要一段时间”。 这是否
我有某种类型的事件列表,其结构如下: { createdAt: 123123132, type: STARTED, metadata: { emailAddress: "foo@bar
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 3 年前。
我发现使用 Web UI 在 arangodb 上创建新用户时遇到了麻烦。首先,我可以创建一个新用户,但无法为该用户分配一个数据库。另外,你能帮忙提供一个使用 arangodb Shell 的方法吗?
我在本地运行 ArangoDB,其中包含来自多个不同项目的数据库、集合、数据和图表。我想备份所有内容,以便重建我的系统。我知道如何备份单个数据库,但因为我有很多数据库,所以我希望一次性完成。 本质上,
应该很容易操作,但我找不到如何实现这一点。我有两个来自不同集合的文档,现在我想使用现有集合中的新 Edge 链接它们。我正在尝试像这样使用 edge-collection.save 函数:edge-c
在我解决 1000 个客户端的任务中,每个客户端都有单独的 ArangoDB,在运行时记录单独的信息......我们需要将这些信息聚合回单个主节点服务器中的集合,以便可以进行查询和报告在上面。研究 J
具有以下结构的文档: { path: String, enabled: Long, disabled: null || Long, // other fields... } 我想通过路
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 3 年前。
我想从 ArangoDB 的文档中删除一个属性。 我认为正确的方法是使用函数 UNSET(doc, attributeName1, ..., attributeNameN) .然而,仅凭这一点,数据库
我是一名优秀的程序员,十分优秀!