Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 20 von 20

Thema: Performance ... COPY FROM

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

    Ausrufezeichen Nachtrag ...

    Vergesst die 15Minuten!

    Vielleicht hätte ich noch ein Wörtchen zu meinen Testdaten verlieren sollen.
    Um ungefähre Zeiten zu bekommen, habe ich das ganze ebenfalls in Perl geschrieben.
    @data_ts = ();

    CREATE_TESTDATA(\@data_ts, 1_000_000);

    OUTPUT_TESTDATA("testdata.csv", \@data_ts, 50_000_000, ",");

    CREATE TABLE testdata

    COPY testdata FROM "testdata.csv"

    DROP testdata
    Als Zeiten bekomme ich dann:
    May 28 09:36:53 BENCHMARK: start!
    May 28 09:37:07 BENCHMARK: prepare: 1000000ts=13.675299sec 1000000int=0.948979sec (nur zum Vergleich! array[int, int])
    May 28 09:38:06 BENCHMARK: out csv ts: 50000000=58.487664sec
    May 28 09:41:09 BENCHMARK: in ts: 50000000 create=0.019609sec copy=183.09616sec drop=0.562754sec
    als Verifikation:
    1.3G May 28 09:38 testdata.csv

    cat testdata.csv | awk "END {print NR;}"
    49998775

    SELECT count(*) FROM
    testdata;
    count
    ----------
    49998775
    im zweiten Durchlauf: + 50Mio (ohne drop)
    May 28 09:56:28 BENCHMARK: in ts: 50000000 copy=183.664664sec
    im dritten Durchlauf: + 50Mio (ohne drop)
    May 28 10:01:31 BENCHMARK: in ts: 50000000 copy=195.304385sec
    im vierten Durchlauf: + 50Mio (mit drop)
    May 28 10:09:53 BENCHMARK: in ts: 50000000 copy=209.041198sec drop=0.829833sec
    d.H. obwohl ich gerade nur noch 55204k RAM frei habe geht das recht fix!
    Belegt für 3-4 Minuten 80-95% CPU-Last auf einem Kernchen und dann ist fertig!!!

    Wenn ich mit meinem Import realer Daten auch nur in den 30min Bereich kommen würde wäre ich vollstens zufrieden.
    (hab gerade 300 Datensätze und mit 8Stunden ist der Import ein Witz, wenn ich weiß das die Hardware ja um einiges schneller ist! )

  2. #12
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.055

    Standard

    Wenn du 50M Testdaten liest, geht das schnell. Wenn du die Sachen in einzelne Dateien splittest, dauert das ewig. Lese ich deine Postings richtig?

    Wie lange brauchst du im Schnitt pro Datei? Wie stark ist dein System beim Lesen ausgelastet? Wie sieht I/O während der Zeit aus?
    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

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

    Pfeil Nachtrag ... config

    Hier die Einträge der postgresql.conf, die von den Standardeinstellungen abweichen bzw. nicht auskommentiert sind:
    listen_addresses = 'localhost'
    port = 5432
    max_connections = 100
    shared_buffers = 10000
    max_fsm_pages = 40000
    max_fsm_relations = 2000
    max_files_per_process = 250
    effective_cache_size = 10000
    redirect_stderr = on
    ist hier was unvorteilhaft für meine Hardware?

    Und nachdem ich ettliche Performancetweakinfos durchgelesen, aber nicht wirklich verstanden habe:
    #fsync = on
    oder
    #fsync = off


    So nun mache ich mich an die ASCII Dateien bzw. Scripting fürs psql.

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

    Standard

    Zitat Zitat von ads Beitrag anzeigen
    Wenn du 50M Testdaten liest, geht das schnell. Wenn du die Sachen in einzelne Dateien splittest, dauert das ewig. Lese ich deine Postings richtig?

    Wie lange brauchst du im Schnitt pro Datei? Wie stark ist dein System beim Lesen ausgelastet? Wie sieht I/O während der Zeit aus?
    ne geht nicht ums lesen der kleinen Fitzeldateien, sondern um den COPY FROM Befehl der anscheinend in einer LOOP voll ausgebremst wird und unter verwendung des DBI-Package unter Perl noch ein immenser Speicherfresser wird! (egal wie der SQL befehl lautet COPY, SELECT, IMPORT, ...)

    Oder suche ich gerade an der falschen Stelle und der Braucht für das lesen der 1000-8000 kleinen Dateien so lange? (was aber nichts am Speicherproblemchen ändert)

    Ein Tip?

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

    Standard

    Zitat Zitat von ads Beitrag anzeigen
    Wenn du 50M Testdaten liest, geht das schnell. Wenn du die Sachen in einzelne Dateien splittest, dauert das ewig. Lese ich deine Postings richtig?

    Wie lange brauchst du im Schnitt pro Datei? Wie stark ist dein System beim Lesen ausgelastet? Wie sieht I/O während der Zeit aus?
    Ähm der I/O?

    das System hat währenddessen nur diese eine Aufgabe zu erledigen, zwischenzeitlich passiert sonst nix! Auffällig ist, dass der für die ersten 10 Dateien (je ca 1MB) ewig braucht und danach auch für Dateien mit 3 Zeilen Inhalt 1-5min vergeudet.

    wie bekomme ich genauere Informationen zum I/O?

  6. #16
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.465

    Standard

    Zitat Zitat von Todidlidu Beitrag anzeigen
    Hallo,

    ich bin noch relativ neu in der Materie Postgres und so hoffe ich dass ihr mir etwas weiterhelfen könnt.
    Wir können es zumindest ersuchen, dazu solltest Du aber die bisher gestellten Fragen mal beantworten. Ich stelle sie nochmal nun:

    Real habe ich nun an die Hälfte der Datenmenge aber auf
    viele kleinere Dateien (1000-5000) verteilt.
    (Eine Datei pro Tabelle)
    Ist es notwendig, diese alle in einer einzelnen TX einzulesen oder nicht?

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

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

    $dbh->disconnect();
    undef $dbh;
    kann so nicht funktionieren, da $tablename und $filename in der Schleife entweder den Wert haben, den sie vor der Schleife hatten oder nicht initialisiert sind.


    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?
    Hast Du inzwischen mal versucht, mittels Deines Perl-Dingens oder anderweiting eine ASCII-Datei zu erzeugen, die einfach nur die COPY-Befehle (mit den korrekten Tabellen- und Dateinamen) enthält und diese mittels psql zu verarbeiten?


    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. #17
    Todidlidu ist offline Neuer Benutzer
    Registriert seit
    27.05.2008
    Beiträge
    8

    Unglücklich Nachtrag ...

    Dann will ich schnell ein paar Antoworten geben:

    1: jede Datei ist für sich! dh eine TX ist nur beim Import einer einzelnen Datei von Nöten.

    2: $tablename und $filename werden selbsverständlich in jedem durchgang aktualisiert bzw. $tablename wird aus dem $filename generiert!

    3: an der ASCII Datei und psql arbeite ich gerade, muss ja sicherstellen, dass ich aktuelle Daten nicht überschreibe!
    aber ich hab noch etwas anderes Versucht:

    Habe Datei erstellt mit 2000 Einträgen und diese dann über eine LOOP mehrmals eingelesen:
    @data_ts = ();

    CREATE_TESTDATA(\@data_ts, 100_000);

    OUTPUT_TESTDATA("testdata.csv", \@data_ts, 2_000, ",");

    CREATE TABLE testdata

    LOOP (1-25) {
    COPY testdata FROM "testdata.csv"
    }

    DROP testdata

    Als Ergebnis bekam ich dann:
    25:
    May 28 11:46:07 BENCHMARK: in ts: 2000 create=0.241137sec copy=0.175892sec drop=0.002148sec
    250:
    May 28 11:46:34 BENCHMARK: in ts: 2000 create=0.014845sec copy=1.818213sec drop=0.009241sec
    2500:
    May 28 11:47:04 BENCHMARK: in ts: 2000 create=0.003328sec copy=18.584012sec drop=0.066867sec
    25000:
    May 28 11:49:48 BENCHMARK: start!
    May 28 11:52:53 BENCHMARK: in ts: 2000 create=0.019924sec copy=184.361522sec

    So langsam beschleicht mich das Gefühl, dass ich das Problem doch woanders zu suchen habe?

    Das Speicherleck ist aber weiterhin da!

    => ich gebe die Info mit dem Ergebnis der ASCII Datei und psql


  8. #18
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.465

    Standard

    Zitat Zitat von Todidlidu Beitrag anzeigen
    Das Speicherleck ist aber weiterhin da!
    wie stellst Du das einklich fest?

    Ich frage, weil $firma, die bei uns hier die zentrale Warenwirtschaft betreut, auch kürzlich behauptet hat, unser Server hätte nicht genug RAM. Ich habe ihnen dann erklärt, warum unter /proc/meminfo der Wert für MemFree: alleine exakt gar nix sagt...

    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. #19
    Todidlidu ist offline Neuer Benutzer
    Registriert seit
    27.05.2008
    Beiträge
    8

    Pfeil freier Speicher?

    ich schaue mit top und lass dann parallel den Prozess laufen, nach Neustart hab ich 7,5GB frei, wenn ich ein paar Perl Scripte laufen lassen. Dann komme ich nach dem beenden immer wieder an diesen Wert ran.

    Nur sobald das Perl Script (egal ob manuell oder als cronjob) einen SELECT, COPY, etc. in die Datenbank macht, geht der freier Speicher nach unten. (bis 50MB) und die Anzeige geht auch nach beenden des Script nicht wieder auf den Anfangswert zurück! Die Geschwindigkeit der Prozesse nimmt dann drastisch ab, Prozessorauslastung geht für ein paar Minuten runter. bis er dann wieder weiter macht!

    SWAP: bleibt bei 0k cached

    wird dann aber nach und nach und nach gefüllt und freier Speicher nimmt daher wieder zu!

    Wenn diese Anzeige nicht stimmt, wie bekomme ich dann die aktuelle Speicherauslastung (wirklicher Wert, und wozu dann diese Ansicht, wenn sie eh nicht stimmt?)

  10. #20
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.465

    Standard

    Zitat Zitat von Todidlidu Beitrag anzeigen
    ich schaue mit top und lass dann parallel den Prozess laufen, nach Neustart hab ich 7,5GB frei, wenn ich ein paar Perl Scripte laufen lassen. Dann komme ich nach dem beenden immer wieder an diesen Wert ran.


    Wenn diese Anzeige nicht stimmt, wie bekomme ich dann die aktuelle Speicherauslastung (wirklicher Wert, und wozu dann diese Ansicht, wenn sie eh nicht stimmt?)
    Ich hab nicht gesagt, das die Anzeige nicht stimmt. Der Punkt ist, daß der Mem free - Wert alleine nix sagt. Wenn das System Gigabyteweise Dateien lesen und schreiben muß, verwendet er RAM als CACHE, in der Hoffnung, daß dieselbe Datei ja vielleicht bald wieder angefordert wird. Das sind dann Mem buffers bzw. caches in /proc/meminfo. Die Alternative zu diesem Verhalten wäre, diese Daten nicht im RAM zu cachen. Dann würde Mem free auch schön groß bleiben, Du könntest den RAM dann auch getrost ausbauen und bei ebay verhöckern.

    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

Seite 2 von 2 ErsteErste 12

Ähnliche Themen

  1. pgcrypto copy from
    Von Ciatronical im Forum SQL
    Antworten: 7
    Letzter Beitrag: 21.10.2010, 22:34
  2. COPY FROM DAT-File
    Von Ciatronical im Forum SQL
    Antworten: 2
    Letzter Beitrag: 20.09.2010, 23:04
  3. insert bzw. copy
    Von tmoebus im Forum Trigger und Funktionen
    Antworten: 2
    Letzter Beitrag: 08.02.2008, 18:18
  4. COPY und Funktionen
    Von beho im Forum SQL
    Antworten: 3
    Letzter Beitrag: 22.11.2007, 13:33
  5. Fehler bei copy
    Von dantro32 im Forum Allgemeines
    Antworten: 1
    Letzter Beitrag: 16.08.2007, 13:27

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