2017-05-10 1 views
2

Ich habe einen sehr großen CSV-Datensatz habe (900M Datensätze), die im folgende Format besteht:Parst einen sehr großen CSV-Datensatz

URL | IP | ActivityId 

Beispieldaten:

http://google.com/ | 127.0.0.1 | 2 
http://google.com/ | 12.3.3.1 | 2 

für dieses Format, ich wünsche um alle einzigartigen Aktivitäten pro URL zu erhalten.

Was ich versucht habe, war ein Wörterbuch zu erstellen, wo der Schlüssel die URL ist, und der Wert ist eine Reihe von einzigartigen Aktivitäten. Dies scheitert jedoch miserabel an der Leistungsfähigkeit - es verbraucht den gesamten RAM und ist sehr langsam (O (n) Operation)

Gibt es einen anderen schnelleren Ansatz?

Antwort

0

Meiner Meinung nach können Sie dask verwenden.

dann gibt es same solution als Pandas:

df.groupby('URL')['ActivityId'].nunique() 
+0

Was ist mit den Aktivitäten auswählen, die nur einmalig an die angegebene URL sind, und erscheinen nicht in anderen URLs? – kjanko

+0

Es ist komplizierter, nicht sicher, ob DASK es unterstützt. Aber gib mir eine Zeit, ich versuche eine Lösung zu finden. – jezrael

+0

Es ist wirklich schwer, vielleicht besser ist eine neue Frage mit Beispiel und gewünschter Ausgabe, auch etwas Code, was Sie versuchen. Jetzt habe ich keine Lösung dafür :( – jezrael

0

Ich nehme an, dass Sie das Dataset tatsächlich bereits in den Speicher geladen haben (sagen wir es in einer Variablen mit dem Namen df), und Probleme bekommen, wenn Sie versuchten, alle eindeutigen Aktivitäten pro URL zu erhalten.

Wenn Sie nur die Anzahl der einzigartigen Aktivitäten pro URL möchten, verwenden Sie die .groupby() Methode:

df.groupby('URL').ActivityId.nunique() 

Wenn Sie auch alle wollen ActivityId s, verwenden .drop_duplicates():

df[['URL','ActivityId']].drop_duplicates() 
0

Zuerst haben um Klarheit über Ihre Anforderungen zu bekommen. Wenn Sie 900 MB Daten haben; und Sie beabsichtigen, alle diese Daten in ein einziges Wörterbuch zu schieben - dann sollten Sie nicht überrascht sein zu finden, dass Sie am Ende 900 MB RAM benötigen.

Mit anderen Worten: Wenn Sie alle Daten im Speicher gleichzeitig verarbeiten möchten, müssen alle Daten im Speicher vorhanden sein.

Um die Verarbeitung zu beschleunigen: Ich würde gehen und sortieren Ihre CSV-Eingabe zuerst (in der URL-Spalte); zum Beispiel mit awk. Jetzt können Sie diese Datei Zeile für Zeile lesen; aber Sie wissen, dass alle Zeilen mit identischen URLs als "Blöcke" angezeigt werden. Bedeutung: Jetzt müssen Sie nicht mehr lesen alle URLs im Speicher; Sie können sie stattdessen nacheinander bearbeiten.

Verwandte Themen