PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PostgreSQL: Speicherleck in PQexec?



nobody0
21-06-2006, 18:08
Beim Import von einigen Daten ist mein C-Programm nach ca. 50 Mio. Zeilen stehengeblieben und zwar bei PQexec.
Ein Nachsehen mit top zeigt, daß der Speicherverbrauch gigantisch ist und die Ursache sein muß:

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
32290 nobody0 15 0 1214m 615m 960 S 0 40.5 30:59.90 /home/nobody0/foo/bar/import_data1/import_data1

Aber in dem C-Programm gibt es kein Malloc oder ähnliches und es werden auch nur einzelne Zeilen eingelesen und importiert.
Hat PQexec oder eine andere PostgreSQL-Funktion ein Speicherleck? :confused:

Christoph
22-06-2006, 07:57
Ich vermute mal, dass Du selber das Speicherleck verusrsachst, weil Du PQclear vergisst. Zur Erinnerung:

PQexec = Konstruktor von PGresult
PQclear = Destruktor von PGresult

Der im Konstruktor allocierte Speicher wird natürlich nur freigegeben, wenn der Destruktor aufgerufen wird.

nobody0
22-06-2006, 08:38
Achso; das ist mir neu, weil das im Buch, dessen Beispiele ich nur ausgebaut habe, nicht erwähnt wird und auch in den Beispielen fehlt :rolleyes:

Christoph
23-06-2006, 08:16
Achso; das ist mir neu, weil das im Buch, dessen Beispiele ich nur ausgebaut habe, nicht erwähnt wird und auch in den Beispielen fehlt
Scheint ja kein vertrauenerweckendes Buch zu sein. Ein knappe aber vernünftige Zusammenfassung der Client-Programmeirung findest Du hier:
http://lionel.kr.hs-niederrhein.de/~dalitz/data/lehre/DBS/Kap1.5-4up.pdf

nobody0
23-06-2006, 12:11
Ja, das Buch "Datenbank-Anwendungen mit PostgreSQL" machte zwar einen guten Eindruck und es ist gut lesbar, aber der Autor hat nicht viel Ahnung vom Thema, da nirgends PQclear erwähnt wird. Damit funktionieren die HelloWorld-Beispiele, aber nicht das Einlesen von ein paar Millionen Datensätzen.
Über google findet man aber reichlich Beispiele, wo es richtig gemacht wird.