我有一个无向图,其中有4,000,000,000(四十亿)个边,它们以节点id对的形式在一个大型文本文件中表示。 我想计算这个图的连通组件。不幸的是,一旦你将带有边缘的节点id加载到内存中,这将占用超过我可用的128GB RAM。
是否有一种外部算法可以找到相对简单的连接组件实现? 或者更好的是,它能够通过Unix命令工具和现有的(Python)库拼凑在一起吗?
是否有一种外部算法可以找到相对简单的连接组件实现? 或者更好的是,它能够通过Unix命令工具和现有的(Python)库拼凑在一起吗?
int nextColor=1;
int merges=0;
int[] vertices;
while (!file.eof()) {
link=file.readLink();
c1=vertices[link.a];
c2=vertices[link.b];
if ((c1==0)&&(c2==0)) {
vertices[link.a]=nextColor;
vertices[link.b]=nextColor;
nextColor++;
} else if ((c1!=0)&&(c2!=0)) {
// both colored, merge
for (i=vertices.length-1;i>=0;i--) if (vertices[i]==c2) vertices[i]=c1;
merges++;
} else if (c1==0) vertices[link.a]=c2; // only c1 is 0
else vertices[link.b]=c1; // only c2 is 0
}
nextColor
是否已达到最大值,有一个未使用的颜色数组(在合并中释放),如果没有可以使用的颜色,则跳过对新的两个顶点进行着色,然后重新运行文件读取过程,如果两种颜色都被使用且发生任何合并。更新:由于顶点实际上不是整数而是字符串,因此在解析该文件时还应具有从字符串到整数的映射。如果您的字符串受长度限制,您可能可以将它们全部放入内存作为哈希表,但我会预处理该文件,创建另一个文件,其中所有字符串"s1"替换为"1","s2"替换为"2"等等,其中"s1","s2"是文件中出现的顶点名称,以便将数据压缩为一对整数的列表。如果您稍后将处理类似的数据(即,您的图形变化不大,并且包含大部分相同的顶点名称),请将“元数据”文件与名称到整数的链接存储起来,以便进一步预处理。