Wie führe ich eine SQL-ähnliche Verbindung in Perl aus?

8

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%     
sfactor 03.01.2012, 12:21
quelle

6 Antworten

8

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.

    
Øyvind Skaar 03.01.2012 12:53
quelle
2

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.

    
Bill Ruppert 03.01.2012 17:09
quelle
0

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.

    
Alien Life Form 03.01.2012 16:29
quelle
0

Ich habe das nicht wirklich versucht, aber eine kreativere Lösung könnte sein:

  1. Lesen Sie jede Datei einmal und erstellen Sie eine Karte zwischen den eindeutigen ID + DOK-Kombinationen und ihren Positionen in der Datei. Verwenden Sie tell () .
  2. Erstellen Sie die Karte in Perl
  3. Lesen Sie die tatsächlichen Daten aus den Dateien mithilfe der Positionen in der Karte und sysread ()
  4. Schreiben Sie die Daten in eine neue Datei
Øyvind Skaar 04.01.2012 10:54
quelle
0

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.

    
Darren Duncan 09.01.2012 06:10
quelle
0

Sie können auch versuchen DBD :: AnyData

    
KneLL 09.01.2012 12:41
quelle

Tags und Links