Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   IBAlloc out of memory (https://www.delphipraxis.net/206622-iballoc-out-memory.html)

stalkingwolf 13. Jan 2021 13:57

Datenbank: FB • Version: 2.5.1 • Zugriff über: IBX

IBAlloc out of memory
 
Nachdem ich mir den IBX Code ausgelagert habe und nun selber übersetzten kann habe ich mir einmal die Problematik "Zu wenig Arbeitsspeicher" "Out of Memory" angeschaut.

In der IB.pas in der Funktion IBAlloc knallt es irgendwann bei ReallocMem(Pointer(P), NewSize) wenn NewSize ca den Wert von 262764000 erreicht hat. IBAlloc hat sich von D6 bis 10.1 quasi nicht geändert und es gibt auch keinerlei Plausibilitätschecks. Es knallt einfach.

Die vorausgehende Funktion ist AdjustPosition in IBCostumDataSet.
Ich bin am überlege wie ich das Problem abfange. Wir nutzten nämlich in diversen Programm TIBDataset und das Ding müllt sich einfach immer weiter zu, bis es irgendwann knallt.

Im Netz habe ich folgendes noch gefunden :
http://www.codenewsfast.com/cnf/thre...hr-ng1932q1236
Wobei ich denke das die erwähnten Codeschnippsel in XE4 implementiert sind und mit nichts zu tun hat.

Jemand sich schon einmal beschäftigt?

Neumann 14. Jan 2021 11:48

AW: IBAlloc out of memory
 
Sollte man nicht was "moderneres" als IBX für den Zugriff auf Firebird-Datenbanken verwenden? Denke mit IBDAC, Firedac o. ä. hat man solche Probleme nicht.

Wir benutzen wo es geht IBDac, ist relativ einfach.

stalkingwolf 15. Jan 2021 08:56

AW: IBAlloc out of memory
 
Moin,

Nett gemeint, aber bringt mir nichts, weil wir bestehenden Code besitzen welcher uns die Probleme macht.

Wie wir das mittlerweile vermeiden wissen wir. Anfang wurde aber ... naja großzügig programmiert.
Das Problem in IBAlloc bzw. IBCustomDataSet ist sogar noch in den neuesten 10.* Delphi Versionen.
Es wurde nie anders implementiert. Das Ding fragt einfach Speicher für RecordNumber * BufferSize ( Länge des Datensatzes ermittelt aus den Feldlängen ) an. Ausnahme ist nur unidirectional in dem ein MOD 2 auf RecordNumber gesetzt wird.

Dann wird stumpf beim einlesen mit ReallocMem der Speicher angefordert und es knallt.

Ich finde 17 Jahre alte Mailinglisten Einträge mit dem Problem. Aber der Entwickler ging da sehr stumpf drüber. Nach dem Motto, Szenario selber Schuld, was in den HEAP passt wird angefordert, sonst scheppert es.


Für die Zukunft schau ich mir das mit IBDac aber einmal an.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:13 Uhr.

Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf