我有一个大文本文件,每行有 2 个数字,表示行中第一个和第二个元素之间的有向边。我正在尝试在 scala 中构建一个图形,将其表示为Map[tailOfEdge,ArrayofHeadsOfEdges]
这样,如果我的文件有
1 2
1 3
2 3
这应该是Map(1-> Array(2,3),2-> Array(3))
但是,我的文件非常大(约 500 万行)
我最初试图阅读整个文件,使用toArray
然后使用groupBy
和积累这种方式。但是,我一直遇到堆大小问题(更不用说他可能是一种非常幼稚的方法)
现在,对我有用的(虽然非常慢)是创建一个可变映射,循环遍历文件的每一行(使用 for 循环),将行分成 2 个数字。给定节点的所有边在文件中都是连续的,所以我只跟踪我期望的节点,如果它是同一个节点,我会累积新的边,如果它是一个新节点,那么我添加完成的累积数组到地图,重置我期望的节点并使用这个新列表重新启动累积数组。
肯定有更好的方法来做到这一点......