Entfernen Sie doppelte Zeilen aus einer großen Datei in Python

Ich habe eine csv-Datei, die möchte ich entfernen Sie doppelte Zeilen aus, aber es ist zu groß, um passen in den Speicher. Ich fand einen Weg, um es getan, aber meine Vermutung ist, dass es nicht der beste Weg.

Jede Zeile enthält 15 Felder und mehrere hundert Zeichen, und alle Felder sind erforderlich, um Eindeutigkeit zu bestimmen. Anstelle des Vergleichs der gesamten Reihe zu finden, ein Duplikat, ich Vergleiche hash(row-as-a-string) in einem Versuch, um Speicherplatz zu sparen. Ich einen filter setzen, der Partitionen die Daten in einer etwa gleichen Anzahl von Zeilen (z.B. Tage der Woche), und jede partition ist klein genug, dass eine lookup-Tabelle der hash-Werte für die partition wird in den Speicher passt. Passiere ich die Datei einmal für jede partition, die überprüfung für eindeutige Zeilen und schreiben Sie Sie heraus in eine zweite Datei (pseudo-code):

import csv

headers={'DayOfWeek':None, 'a':None, 'b':None}
outs=csv.DictWriter(open('c:\dedupedFile.csv','wb')
days=['Mon','Tue','Wed','Thu','Fri','Sat','Sun']

outs.writerows(headers)

for day in days:
    htable={}
    ins=csv.DictReader(open('c:\bigfile.csv','rb'),headers)
    for line in ins:
        hvalue=hash(reduce(lambda x,y:x+y,line.itervalues()))
        if line['DayOfWeek']==day:
            if hvalue in htable:
                pass
            else:
                htable[hvalue]=None
                outs.writerow(line)

Einer Weise, die ich dachte, um diese Fahrt ist von der Suche nach einem besseren filter zu verringern die Anzahl der Durchläufe notwendig. Vorausgesetzt, die Länge der Zeilen ist gleichmäßig verteilt, vielleicht anstelle von

for day in days: 

und

if line['DayOfWeek']==day:

wir haben

for i in range(n):

und

if len(reduce(lambda x,y:x+y,line.itervalues())%n)==i:

wo 'n', die kleiner als Speicher zu erlauben. Das ist aber immer noch mit der gleichen Methode.

Wayne Werner eine gute praktische Lösung unten; ich war neugierig, ob es besser/schneller/einfacher Weg, dies zu tun von einem Algorithmus Perspektive.

P. S. ich bin beschränkt auf Python 2.5.

  • Tun Sie Ihre Ausgabe-Zeilen müssen in der gleichen Reihenfolge, wie Sie auf die input-Datei? Erwarten Sie viele Wiederholungen, oder sollte die output-Datei-Größe halten mehr oder weniger die gleiche Größenordnung wie die der input-Datei (oder ist das nicht vorhersehbar)?
  • Die Reihenfolge der Zeilen in der Ausgabe-Datei ist nicht wichtig. Für diesen speziellen Fall gibt es relativ wenige Dubletten. Denken Sie, dass die Anzahl der Duplikate hat Lager im Allgemeinen Fall?
  • Es könnte, wenn, zum Beispiel, die eindeutige Zeilen passen in den Speicher (auch wenn die vollständige Datei mit der duplizierten, würde nicht). Ich muss für eine Weile verlassen, aber ich werde einen Vorschlag machen, später.
  • Das edit bedeutet, dass Sie interessiert sind, Antworten, die nicht gut oder nicht praktikabel ist oder die Lösung nicht sein -- warum?
  • Machin: ich meinte zu vermitteln, dass ich interessiert daran war, die Theorie, die hinter der Lösung. Ich nahm Wayne Werners Antwort sowieso, da es das problem lösen.
InformationsquelleAutor JonC | 2010-08-10
Schreibe einen Kommentar