C: Speicherverwaltung & libmysqlclient

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
matman
Beiträge: 744
Registriert: 03.07.2008 10:50:07
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Hamburg
Kontaktdaten:

C: Speicherverwaltung & libmysqlclient

Beitrag von matman » 16.03.2009 18:05:10

Hallo,

ich schreibe gerade ein kleines Tool mit dem ich csv Dateien in eine MySQL Tabelle eintrage. Ich schreibe das in C, weil wegen der Menge der Datensätze ein PHP-Skript viel zu langsam ist. Das Prog läuft soweit auch schon sehr gut. Allerdings habe ich mal eine mehr oder weniger allgemeine Frage zur Speicherverwaltung unter Linux. Folgendes erzählt mir nämlich valgrind:

Code: Alles auswählen

==4546== 24 bytes in 1 blocks are still reachable in loss record 1 of 2
==4546==    at 0x4C2260E: malloc (vg_replace_malloc.c:207)
==4546==    by 0x508FE42: my_malloc (in /usr/lib/libmysqlclient.so.15.0.0)
==4546==    by 0x5090AEA: my_error_register (in /usr/lib/libmysqlclient.so.15.0.0)
==4546==    by 0x508E989: mysql_server_init (in /usr/lib/libmysqlclient.so.15.0.0)
==4546==    by 0x50B4DCE: mysql_init (in /usr/lib/libmysqlclient.so.15.0.0)
==4546==    by 0x401A89: data_insert_main (insert-main.c:31)
==4546==    by 0x401F65: main (main.c:77)
==4546== 
==4546== 
==4546== 61,320 bytes in 15 blocks are still reachable in loss record 2 of 2
==4546==    at 0x4C2260E: malloc (vg_replace_malloc.c:207)
==4546==    by 0x5096895: my_once_alloc (in /usr/lib/libmysqlclient.so.15.0.0)
==4546==    by 0x5096F4F: (within /usr/lib/libmysqlclient.so.15.0.0)
==4546==    by 0x509782C: (within /usr/lib/libmysqlclient.so.15.0.0)
==4546==    by 0x5097B13: get_charset_by_csname (in /usr/lib/libmysqlclient.so.15.0.0)
==4546==    by 0x50B4BC1: mysql_init_character_set (in /usr/lib/libmysqlclient.so.15.0.0)
==4546==    by 0x50B6AA7: mysql_real_connect (in /usr/lib/libmysqlclient.so.15.0.0)
==4546==    by 0x401AE6: data_insert_main (insert-main.c:40)
==4546==    by 0x401F65: main (main.c:77)
Soweit ich das jetzt überblicke, habe ich selbst keine Möglichkeit, diese Speicherblöcke frei zu geben. Denn valgrind beschwert sich über ein 'invalid free', wenn ich das mysql Objekt mit free(); anspreche. Und eine entsprechende mysql_free(); Funktion gibt es wohl nicht, wie es aussieht.

Darum meine Frage: Ist das jetzt eigentlich schlimm, oder gibt der Linux-Kernel den Speicher irgendwann von sich aus wieder frei?
System: Bullseye
Hardware: Gigabyte 970A-DS3P mit AMD FX-6300, Kingston HyperX DDR3-1333 (4x4GB), Samsung SSD 860 EVO, HGST Travelstar 7K1000, Samsung DVD-ROM SH-D162D, Geforce GTX 1050, SoundBlaster Live! Platinum, Hauppauge WinTV-HVR-5525

Benutzeravatar
GoKi
Beiträge: 2068
Registriert: 04.07.2003 23:08:56
Lizenz eigener Beiträge: MIT Lizenz

Re: C: Speicherverwaltung & libmysqlclient

Beitrag von GoKi » 17.03.2009 01:02:47

Wenn sich dein Programm beendet, dann gibt der Kernel den Speicher normalerweise wieder frei.
Zu MySQL im Speziellen kann ich dir leider nicht weiter helfen, außer das Google folgenden Treffer liefert
http://bugs.mysql.com/bug.php?id=37047
MfG GoKi
:wq

Benutzeravatar
matman
Beiträge: 744
Registriert: 03.07.2008 10:50:07
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Hamburg
Kontaktdaten:

Re: C: Speicherverwaltung & libmysqlclient

Beitrag von matman » 24.03.2009 17:04:57

GoKi hat geschrieben:Wenn sich dein Programm beendet, dann gibt der Kernel den Speicher normalerweise wieder frei.
Heisst also, wenn ich ein Programm hätte, das sogenannte Löcher im Speicher entstehen lässt, dann wäre der betroffene Speicher nach Beendigung des "schlimmen Programmes" wieder verfügbar. Oder habe ich das falsch verstanden?
GoKi hat geschrieben:Zu MySQL im Speziellen kann ich dir leider nicht weiter helfen
Da habe ich auch soweit alles was ich wissen wollte. Bei meiner Suche in Google habe ich erfahren: Es gibt keine Funktion, mit der man diesen Speicher wieder frei geben kann. Das sollte eigentlich laut MySQL-Dokumentation von alleine passieren, wenn man mysql mit mysql_init(NULL); initialisiert. Geht aber nicht. Eine Bugmeldung gibt es auch bereits. Weiss jetzt aber auch nicht mehr wo.
System: Bullseye
Hardware: Gigabyte 970A-DS3P mit AMD FX-6300, Kingston HyperX DDR3-1333 (4x4GB), Samsung SSD 860 EVO, HGST Travelstar 7K1000, Samsung DVD-ROM SH-D162D, Geforce GTX 1050, SoundBlaster Live! Platinum, Hauppauge WinTV-HVR-5525

Antworten