Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 20

Thema: Performance ... COPY FROM

  1. #1
    Todidlidu ist offline Neuer Benutzer
    Registriert seit
    27.05.2008
    Beiträge
    8

    Frage Performance ... COPY FROM

    Hallo,

    ich bin noch relativ neu in der Materie Postgres und so hoffe ich dass ihr mir etwas weiterhelfen könnt.

    Ich habe meine Datenstruktur erstellt:
    create table PRM00001 (time timestamp(3), PRM00001 integer);
    grant select on PRM00001 to usrread;
    grant all on PRM00001 to usrwrite;
    create table PRM00002 (time timestamp(3), PRM00002 bigint);
    grant select on PRM00002 to usrread;
    grant all on PRM00002 to usrwrite;
    create table PRM00003 (time timestamp(3), PRM00003 varchar(20));
    grant select on PRM00003 to usrread;
    grant all on PRM00003 to usrwrite;
    create table PRM00004 (time timestamp(3), PRM00004 double precision);
    grant select on PRM00004 to usrread;
    grant all on PRM00004 to usrwrite;
    ...
    create table PRM09000 (time timestamp(3), PRM09000 double precision);
    grant select on PRM09000 to usrread;
    grant all on PRM09000 to usrwrite;
    und diese möchte ich nun mit Daten füllen.
    Hierzu verwende ich COPY mit vorbereiteten Datensätzen
    aus Messungen:
    2008-05-27 00:00:00.001, 1234
    2008-05-27 00:00:01.301, 2134
    2008-05-27 00:00:02.000, 1234
    2008-05-27 00:00:03.410, 1534
    2008-05-27 00:00:04.501, 1278
    ...
    2008-05-27 23:59:59.001, 4328
    Mein Testdatensatz hatte 50 000 000 Einträge der Art
    2008-05-27 00:00:03.410, 1534
    ...
    und wird in knapp 15 Minuten in eine Table geblasen.

    Real habe ich nun an die Hälfte der Datenmenge aber auf
    viele kleinere Dateien (1000-5000) verteilt.
    (Eine Datei pro Tabelle)

    folgender Code:
    my $dbh = DBI->connect();

    LOOP OVER FILES
    {
    $statement = "COPY $tablename FROM $filename CSV;";
    $dbh->do($statement);
    }

    $dbh->disconnect();
    undef $dbh;
    benötigt knapp 24 Stunden und hat schon nach wenigen Minuten 8GB Arbeitsspeicher allokiert die auch nach dem Beenden des Scripts nicht wieder freigegeben werden.

    Mein erster Schritt war nun diesen Code mehrmals Parallel laufen zu lassen
    und konnte so die Bearbeitungszeit auf 3-4 Stunden drücken, das Speicherproblem besteht jedoch weiterhin und verlangsamt das Einlesen nachfolgender Messungen bis zu 8 Stunden trotz Parallelbearbeitung.

    Kein Vergleich zu den 15Minuten Bearbeitungszeit meines Testdatensatzes!

    Das Speicherleck habe ich auf die Datenbankzugriffe eingegrenzt, wenn ich meinen Code ohne diese ausführe, dann benötige ich kein MB Speicher.

    Meine PostgreSQL config ist nahezu unverändert kann ich hier mehr Geschwindigkeit rauskitzeln, oder hat mir sonst einer eine Idee wo der Flaschenhals/Bremse sein kann und wie das/die Problem/e (Geschwindigkeit + Speicher) zu lösen ist?

    Software:
    RH EL 5 - 2.6.18-53.1.19.el5 - x86_64
    PostgreSQL 8.1.11
    Perl, v5.8.8 built for x86_64-linux-thread-multi
    Hardware:
    DELL PE2950
    DUAL QUAD 2,4GHz
    8GB RAM
    2x74GB SCSI RAID 1

    Database auf
    6x1TB S-ATA RAID 5 - Ext3
    Vielen dank im Vorraus,

    Todi.

  2. #2
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von Todidlidu Beitrag anzeigen
    Real habe ich nun an die Hälfte der Datenmenge aber auf
    viele kleinere Dateien (1000-5000) verteilt.
    (Eine Datei pro Tabelle)
    Schnellschuß:

    bastle Dir eine simple ASCII-Datei, welche die COPY-Befehle enthält, und übergib diese an psql. Damit sparst Du Dir den Perl-Kram, welche möglicherweise Ursache der Speicherprobleme ist.

    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  3. #3
    Todidlidu ist offline Neuer Benutzer
    Registriert seit
    27.05.2008
    Beiträge
    8

    Standard Nachtrag

    Danke,

    Ich werde es gleich Mal versuchen.

    In den vorbereiteten Datein könnten noch Fehler enthalten sein (Format, falsches Zeichen, nicht vorhandene Tabelle) diese fange ich ab und beware mir diese Dateien zur manuellen Nachbearbeitung. die restlichen Dateien werden gelöscht.
    Habe ich mit den angereiten COPY Befehlen und psql die Möglichkeit die Fehlerinformation einer Datei zuzuordnen? Mir scheint die Fehler/Debug-informationen sehr dürftig!

    Ist hier eine mehrfache Ausführung ratsam?
    z.B 8 ASCII Dateien an je eine psql Instanz zu senden?

    Wie lässt sich das mit den Nutzer realisieren? Bei mir funktioniert psql nur unter user postgres ohne Einschränkung, der Datenimport sollte jedoch unter einem weniger berechtigten user vorgenommen werden.

  4. #4
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.020

    Standard

    Sehe ich das richtig, dass du 50 Millionen Datensätze in einem Schwung in die Datenbank schieben möchtest?

    Das stellt an sich kein Problem dar - nur mit der Standardkonfiguration wirst du da nicht weit kommen. Hierfür ist etwas mehr Tuning an den Speichereinstellungen und am Backgroundwriter gefragt.
    Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören

    Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

    PostgreSQL Service & Support

  5. #5
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von ads Beitrag anzeigen
    Sehe ich das richtig, dass du 50 Millionen Datensätze in einem Schwung in die Datenbank schieben möchtest?

    Das stellt an sich kein Problem dar - nur mit der Standardkonfiguration wirst du da nicht weit kommen. Hierfür ist etwas mehr Tuning an den Speichereinstellungen und am Backgroundwriter gefragt.
    @ads: er hat das bereits erfolgreich getan ;-)

    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  6. #6
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von Todidlidu Beitrag anzeigen
    Danke,

    Ich werde es gleich Mal versuchen.

    In den vorbereiteten Datein könnten noch Fehler enthalten sein (Format, falsches Zeichen, nicht vorhandene Tabelle) diese fange ich ab und beware mir diese Dateien zur manuellen Nachbearbeitung. die restlichen Dateien werden gelöscht.
    Habe ich mit den angereiten COPY Befehlen und psql die Möglichkeit die Fehlerinformation einer Datei zuzuordnen? Mir scheint die Fehler/Debug-informationen sehr dürftig!
    Dann baust Du Dir halt ein Shell-Script, was für jede COPY-Datei separat psql aufruft. Allerdings mit einem Nachteil: Du kannst das dann nicht mehr komplett in eine Transaktion laufen lassen.

    Soll es nach dem Prinzip 'Alles oder Nix' gehen, wirst Du aber eine TX verwenden wollen. Die Fehlerausgabe dann halt in eine Datei leiten, IMHO sollten genug Infos da drin sein, Fehler zu finden.

    Ist hier eine mehrfache Ausführung ratsam?
    z.B 8 ASCII Dateien an je eine psql Instanz zu senden?
    Glaube ich eher nicht, denn das ist vor allem I/O-intensiv zur Festplatte. probieren.

    Wie lässt sich das mit den Nutzer realisieren? Bei mir funktioniert psql nur unter user postgres ohne Einschränkung, der Datenimport sollte jedoch unter einem weniger berechtigten user vorgenommen werden.
    psql kennt den Parameter -U, den Du offenbar bisher übersehen hast.


    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  7. #7
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.020

    Standard

    Zitat Zitat von akretschmer Beitrag anzeigen
    @ads: er hat das bereits erfolgreich getan
    Wo steht das?
    Im Einleitungsposting stand nur etwas von nahezu unveränderter Originalconfig.
    Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören

    Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

    PostgreSQL Service & Support

  8. #8
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von ads Beitrag anzeigen
    Wo steht das?
    Im Einleitungsposting stand nur etwas von nahezu unveränderter Originalconfig.
    Zitat:

    Mein Testdatensatz hatte 50 000 000 Einträge der Art

    2008-05-27 00:00:03.410, 1534
    ...

    und wird in knapp 15 Minuten in eine Table geblasen.

    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  9. #9
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.020

    Standard

    Nett.

    Dann würde ich trotzdem weiterhin auf die Config tippen.
    Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören

    Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

    PostgreSQL Service & Support

  10. #10
    hkocam ist offline Benutzer
    Registriert seit
    01.06.2007
    Beiträge
    69

    Standard

    Hi,

    afaik kann pgloader sowas
    PgFoundry: PostgreSQL Loader: Project Info
    Habe ich aber selber noch nicht ausprobiert.

    Dann gibt es noch pgbulkload
    PgFoundry: pg_bulkload: Project Info
    Habe ich leider auch keine Erfahrung mit.

    Ansonsten solltest du deine Config hier noch Mal posten,
    da kann man vielleicht noch was rausholen.

    Freundliche Grüße
    hkocam

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum