计算n个最近节点的大数据网络文件处理的高效算法

Posted

技术标签:

【中文标题】计算n个最近节点的大数据网络文件处理的高效算法【英文标题】:Efficient algorithm to deal with big-data network files for computing n nearest nodes 【发布时间】:2013-03-09 11:01:55 【问题描述】:

问题: 我有两个网络文件(比如 NET1 和 NET2) - 每个都有一组节点,每个节点都有唯一的 ID 和地理坐标 X 和 Y。NET2 中的每个节点都有 n 连接到NET1 和 n 个节点的 ID 将由最小直线距离确定。输出将具有 NET1、NET2 中节点的三个字段 ID 以及它们之间的距离。所有文件都是制表符分隔的格式。

前进的道路.. 实现这一点的一种方法是针对 NET2 中的每个节点,我们循环遍历 NET1 中的每个节点并计算所有 NET1-NET2 距离组合。按 NET2 节点 ID 和距离对其进行排序,并写出每个节点的前四个记录。但问题是 NET1 上有近 200 万个节点,NET2 中有 2000 个节点——即在该算法的第一步中要计算和编写 40 亿个距离……而且运行时间非常令人望而生畏!

请求: 我很好奇你们中是否有人遇到过类似的问题。我很想听听大家关于可用于加速处理的任何算法和数据结构的信息。我知道这个问题的范围很广,但我希望有人能指出正确的方法,因为我在优化这种规模数据的代码方面的经验非常有限。

语言: 我正在尝试使用 C++、Python 和 R。

请提出想法!非常感谢您的帮助!

【问题讨论】:

这是Nearest neighbor search problem。 【参考方案1】:

kd-tree 是选项之一。它允许您在合理的时间内找到最近的邻居(或一组最近的邻居)。当然,您必须在一开始就构建树,这需要一些时间。但一般来说,kd-tree 是合适的,如果您不必在运行时添加/删除节点,这似乎是您的情况。它还具有较低维度的更好性能(在您的情况下,维度为 2)。

另一种可能的数据结构是octree(quadtree 用于 2D),它是更简单的数据结构(很容易实现),但 kd-tree 可以更高效。

【讨论】:

你知道这个数据结构在 Python 或 C++ 中有什么好的实现吗? 在C++中我听说过这个code.google.com/p/kdtree和libkdtree.alioth.debian.org,但没有真正使用过,所以不知道效率如何......

以上是关于计算n个最近节点的大数据网络文件处理的高效算法的主要内容,如果未能解决你的问题,请参考以下文章

客快物流大数据项目(五十四):初始化Spark流式计算程序

大数据项目13(Python实现聚类算法)

嘉乐道新岗位:高级研究员(计算机视觉自然语言处理语音识别深度学习大数据机器人方向)/南京

flink hadoop 从0~1分布式计算与大数据项目实战zookeeper内部原理流程简介以及java curator client操作集群注册,读取

Kafka消息队列大数据实战教程-第五篇(Broker工作原理以及节点服役)

Kafka消息队列大数据实战教程-第五篇(Broker工作原理以及节点服役)