【发布时间】:2020-07-30 23:53:59
【问题描述】:
我正在探索将 Arangodb 作为图形引擎用于我正在从事的需要最短路径分析的项目。
我的收藏是这样的:
- 边集合中约 350 万边的路由网络 (_to/_from)
- 一个顶点集合 ~270 万个顶点([lat,lng] 上的地理索引)。
- 带有开始/结束位置(未映射到节点)的行程集合。
第一个任务是将旅行的起点和终点坐标捕捉到网络上的顶点。我正在使用以下查询来做到这一点:
FOR t IN trips
let snappedFrom = (
FOR x IN nodes
SORT GEO_DISTANCE([t.Orig_Long, t.Orig_Lat], [x.lng, x.lat]) ASC
LIMIT 1
RETURN x._id
)[0]
let snappedTo = (
FOR x IN nodes
SORT GEO_DISTANCE([t.Dest_Long, t.Dest_Lat], [x.lng, x.lat]) ASC
LIMIT 1
RETURN x._id
)[0]
UPDATE t._key WITH {snappedFrom,snappedTo} IN trips
这大约需要 3.5 小时,如果可能的话,我想显着减少。
我在一个具有 32GB RAM 和 8 个内核的 AWS 实例上运行。我注意到在运行这个查询时,它只使用了一个核心,这让我很生气。
我很好奇设置 arangodb 以获得纯粹的性能。我的用例实际上是使用数据库作为计算器。事实上,完成后它很可能会成为 CI/CD 工作流程的一部分。我在那里不需要任何安全卫士,不会有任何并行的用户请求,如果数据不好,我就把它吹走,重新开始。
我正在使用标准的 docker 安装
docker run -it --name=adb --rm -p 8528:8528 -v arangodb:/data -d -v /var/run/docker.sock:/var/run/docker.sock arangodb/arangodb-starter --starter.address=<$IP> --starter.mode=single
当我在所有行程中运行shortest_path 时,我也会遇到同样的问题,如果是单核,这将永远存在。
任何有关配置、更好的查询甚至更好的 AWS 设置的帮助都将不胜感激。
【问题讨论】:
-
有人提到使用 DISTANCE 而不是 GEO_DISTANCE,但几乎没有区别
-
还建议创建一个简单的脚本来安排多个查询(每个 CPU 一个),因为每个查询都在自己的 CPU 中运行。就像使用 LIMIT 子句为每个查询安排 trip_count/cpu_count 一样简单。