Wie kann ich ~ 13 GB Daten analysieren?

Ich habe ~ 300 Textdateien, die Daten zu Trackern, Torrents und Peers enthalten. Jede Datei ist folgendermaßen organisiert:

tracker.txt

time torrent
    time peer
    time peer
    ...
time torrent
...

Ich habe mehrere Dateien pro Tracker und ein Großteil der Informationen wird wiederholt (gleiche Informationen, unterschiedliche Zeiten).

Ich möchte in der Lage sein zu analysieren, was ich habe und Statistiken über Dinge wie zu berichten

Wie viele Torrents gibt es auf jedem Tracker?Wie viele Tracker sind Torrents aufgelistet?Wie viele Gleichaltrige haben Torrents?Wie viele Torrents haben Gleichaltrige?

Die schiere Datenmenge macht es mir schwer. Hier ist, was ich versucht habe.

MySQL

Ich stelle alles in eine Datenbank; Eine Tabelle pro Entitätstyp und Tabellen für die Beziehungen (z. B. dieser Torrent befindet sich auf diesem Tracker).

Das Hinzufügen der Informationen zur Datenbank war langsam (und ich hatte keine 13 GB davon, als ich dies versuchte), aber das anschließende Analysieren der Beziehungen war ein Kinderspiel. Jede leicht komplexe Abfrage dauerte mehr als 24 Stunden (wenn überhaupt).

Eine Beispielabfrage wäre:

SELECT COUNT(DISTINCT torrent) 
    FROM TorrentAtPeer, Peer 
    WHERE TorrentAtPeer.peer = Peer.id 
    GROUP BY Peer.ip;

Ich habe versucht, die Speicherzuweisungen in meinem zu erhöhenmy.cnf Datei, aber es schien nicht zu helfen. Ich habe das benutztmy-innodb-heavy-4G.cnf Einstellungsdatei.

BEARBEITEN: Hinzufügen von Tabellendetails

Folgendes habe ich verwendet:

Peer         Torrent                  Tracker        
-----------  -----------------------  ------------------  
id (bigint)  id (bigint)              id (bigint)
ip* (int)    infohash* (varchar(40))  url (varchar(255))
port (int)

TorrentAtPeer      TorrentAtTracker
-----------------  ----------------
id (bigint)        id (bigint)
torrent* (bigint)  torrent* (bigint)
peer* (bigint)     tracker* (bigint)
time (int)         time (int)

*indexed field. Navicat reports them as being of normal type and Btree method.
id - Always the primary key

Es gibt keine Fremdschlüssel. Ich war zuversichtlich, nur IDs verwenden zu können, die vorhandenen Entitäten entsprachen, und das Hinzufügen einer Fremdschlüsselprüfung schien eine unnötige Verzögerung zu sein. Ist das naiv?

Matlab

Dies schien eine Anwendung zu sein, die für schweres Heben ausgelegt war, aber ich konnte nicht genug Speicher zuweisen, um alle Daten auf einmal zu speichern.

Ich hatte keine numerischen Daten, also verwendete ich Zellen-Arrays. Ich wechselte von diesen, um zu versuchen, den Platzbedarf zu verringern. Ich konnte es nicht zum Laufen bringen.

Java

Mein bisher erfolgreichster Versuch. Ich fand eine Implementierung von Patricia Tries, die von den Leuten bei Limewire bereitgestellt wurde. Auf diese Weise konnte ich die Daten einlesen und zählen, wie viele eindeutige Entitäten ich hatte:

13 Verfolger1.7mil Torrents32mil Peers

Ich finde es immer noch zu schwierig, die Häufigkeit der Torrents bei Gleichaltrigen herauszufinden. Ich versuche dies durch Erstellen von Versuchen wie folgt:

Trie<String, Trie<String, Object>> peers = new Trie<String, Trie<String, Object>>(...);
for (String line : file) {
    if (containsTorrent(line)) {
        infohash = getInfohash(line);
    }
    else if (containsPeer(line)) {
        Trie<String, Object> torrents = peers.get(getPeer(line));
        torrents.put(infohash, null);
    }
}

Soweit ich das geschafft habe, wenn ich das hinbekommepeers In diesem Fall kann ich leicht herausfinden, wie viele Torrents sich bei jedem Peer befinden. Ich habe gestern alles ausgeführt und als ich zurückkam, bemerkte ich, dass die Protokolldatei nicht geschrieben wird^Z die Anwendung undtime meldete folgendes:

real 565m41.479s
user 0m0.001s
sys  0m0.019s

Das sieht für mich nicht richtig aus, sollten Benutzer und System so niedrig sein? Ich sollte erwähnen, dass ich auch die Größe des JVM-Heapspeichers auf 7 GB (max und start) erhöht habe, ohne dass ich ziemlich schnell einen Fehler wegen unzureichendem Arbeitsspeicher bekomme.

Es macht mir nichts aus, mehrere Stunden / Tage zu warten, aber es sieht so aus, als würde das Ding nach ungefähr 10 Stunden zum Stillstand kommen.

Ich denke, meine Frage ist, wie kann ich diese Daten analysieren? Sind die Dinge, die ich ausprobiert habe, die richtigen? Gibt es Dinge, die ich vermisse? Die Java-Lösung scheint die bisher beste zu sein. Kann ich irgendetwas tun, damit sie funktioniert?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage