Ich muss einige Daten verarbeiten, indem ich zwei verschiedene Dateien kombiniere. Beide haben zwei Spalten, die einen Primärschlüssel bilden, den ich verwenden kann, um sie Seite an Seite zu vergleichen. Die Dateien in Fragen sind riesig (etwa 5 GB mit 20 Millionen Zeilen), also würde ich einen effizienten Code benötigen. Wie würde ich das in Perl machen?
Ich gebe ein Beispiel:
Wenn Datei A Spalten enthält
%Vor%Datei B enthält Spalten
%Vor%Ich müsste diese beiden Dateien verbinden, indem ich id und dob in den beiden Dateien abgleiche, um eine Ausgabedatei mit folgenden Spalten zu erhalten:
%Vor%Ich denke, ich würde einfach eine neue mysql / sqlite / was auch immer DB erstellen und die Zeilen einfügen. Sollte ~ 20 Zeilen Perl sein.
Dies erfordert natürlich einen einfachen Zugriff auf eine DB ..
Vielleicht könnten Sie die Dateien auch nach den interessanten Feldern sortieren und dann für jede Zeile in Datei1 die übereinstimmenden Zeilen in Datei2 suchen und drucken.
Die althergebrachte Methode besteht darin, Systemprogramme zu verwenden, um beide Dateien in Schlüsselreihenfolge zu sortieren und sie dann Zeile für Zeile abzugleichen. Lesen Sie beide Dateien, wenn die Schlüssel übereinstimmen, geben Sie die Daten aus. Wenn sie nicht übereinstimmen, lesen Sie die Datei mit dem kleineren Schlüssel, bis sie übereinstimmen. Stellen Sie den Schlüssel unendlich hoch für eine Datei ein, wenn sie eof erreicht. Wenn beide Tasten unendlich hoch sind, sind Sie fertig.
Oder lesen Sie diesen Artikel Techrepublic - Sie Trotzdem brauchen sie immer noch 5G Speicher. Ich frage mich, wo Sie mit den CLI-Sortier- / Join-Utilities von unix / linux effizient arbeiten könnten. Nur ein Gedanke.
Ich habe das nicht wirklich versucht, aber eine kreativere Lösung könnte sein:
Sie können auch mein 3 Jahre altes CPAN-Modul Set :: Relation verwenden, mit dem Sie alle SQL-Funktionen wie Perl verwenden können. Erstellen Sie für jede Datei ein Set :: Relation-Objekt und verwenden Sie anschließend die join () -Methode. Nichtsdestoweniger behält dieses Modul alle Operanden und Speicher, so dass es von Ihrem RAM begrenzt ist. Aber Sie können immer noch die Quelle nachsehen, wie join () funktioniert, und dann basierend darauf eine effizientere Version für Ihre Zwecke implementieren.
Tags und Links perl file-processing filemerge