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);und diese möchte ich nun mit Daten füllen.
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;
Hierzu verwende ich COPY mit vorbereiteten Datensätzen
aus Messungen:2008-05-27 00:00:00.001, 1234Mein Testdatensatz hatte 50 000 000 Einträge der Art
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
2008-05-27 00:00:03.410, 1534und 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();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.
LOOP OVER FILES
{
$statement = "COPY $tablename FROM $filename CSV;";
$dbh->do($statement);
}
$dbh->disconnect();
undef $dbh;
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_64Hardware:
PostgreSQL 8.1.11
Perl, v5.8.8 built for x86_64-linux-thread-multiDELL PE2950Vielen dank im Vorraus,
DUAL QUAD 2,4GHz
8GB RAM
2x74GB SCSI RAID 1
Database auf
6x1TB S-ATA RAID 5 - Ext3
Todi.
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
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.
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
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
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.
Glaube ich eher nicht, denn das ist vor allem I/O-intensiv zur Festplatte. probieren.Ist hier eine mehrfache Ausführung ratsam?
z.B 8 ASCII Dateien an je eine psql Instanz zu senden?
psql kennt den Parameter -U, den Du offenbar bisher übersehen hast.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.
Andreas
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
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
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
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
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
Links: Tobias Bauer - IT- und Funkdienstleistungen - Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen - Funkforum
Lesezeichen