Basierend auf der Beschreibung des Problems, das Sie angegeben haben, und den Antworten, die Sie in den Kommentaren gegeben haben, denke ich, dass der einfachste Weg darin besteht, einen Ansatz wie den beschriebenen @dreamzor zu verwenden. Version der Antwort
Die Grundidee besteht darin, die Daten in ein komprimierteres Format zu konvertieren, das in den Speicher passt, einen regulären Algorithmus für verbundene Komponenten auf diesen Daten auszuführen und sie dann zu dekomprimieren Verknüpfen Sie eine numerische 32-Bit-ID und geben Sie dann den Gesamtspeicherplatz für alle Knoten ist höchstens der Platz für vier Milliarden Knoten und acht Milliarden Kanten (vorausgesetzt, Sie speichern zwei Kopien jeder Kante). Dies ist Platz für zwölf Milliarden 32-Bit-Ganzzahlen, nur etwa 48 GB Speicherplatz unter Ihrer Speicherschwelle.
Um zu beginnen, schreiben Sie ein Skript, das die Kanten-Datei einliest, weist jedem Knoten eine numerische ID zu (vielleicht sequenziell in der Reihenfolge, in der sie erscheinen). Lassen Sie dieses Mapping von diesem Skript in eine Datei schreiben und schreiben Sie eine neue Edges-Datei, die anstelle der String-Namen die numerischen IDs der Knoten verwendet. Wenn Sie fertig sind, haben Sie eine Namensdatei, die IDs auf Namen und eine Edge-Datei zuordnet, die viel weniger Platz als zuvor benötigt. Sie haben in den Kommentaren erwähnt, dass Sie alle Knotennamen in den Speicher einfügen können, daher sollte dieser Schritt sehr vernünftig sein. Beachten Sie, dass Sie nicht alle Kanten im Speicher ablegen müssen - Sie können sie durch das Programm streamen - damit sollte kein Flaschenhals entstehen.
Als nächstes schreiben Sie ein Programm, das die Kanten-Datei - aber nicht die Names-Datei - in den Speicher liest und verbundene Komponenten mit einem vernünftigen Algorithmus findet (BFS oder DFS wäre hier großartig).Wenn Sie mit Ihrem Speicher vorsichtig sind (mit etwas wie C oder C++ hier wäre ein guter Anruf), sollte dies bequem in den Hauptspeicher passen. Wenn Sie fertig sind, schreiben Sie alle Cluster in eine externe Datei mit numerischer ID. Sie haben jetzt eine Liste aller CCs nach ID.
Schreiben Sie schließlich ein Programm, das die ID in die Knotenzuordnung aus der Names-Datei einliest, dann die Cluster-IDs eingibt und die Namen aller Knoten in jedem Cluster in eine endgültige Datei schreibt.
Dieser Ansatz sollte relativ einfach zu implementieren sein, da der Schlüsselgedanke darin besteht, die vorhandenen Algorithmen beizubehalten, aber die Darstellung des Diagramms nur so zu ändern, dass die Speichereffizienz erhöht wird. Ich habe Ansätze wie diese in der Vergangenheit verwendet, wenn es um riesige Graphen (Wikipedia) ging, und es funktionierte sogar auf Systemen mit weniger Speicher als deine.
Wie viele Eckpunkte haben Sie? – dreamzor
@dreamzor Etwa 2 Milliarden. – eleanora
Ich nehme an, Sie brauchen einfache verbundene Komponenten und nicht "stark", da der Graph ungerichtet ist? – dreamzor