Newsgroup: it.comp.lang.delphi
Titolo: out of memory

Ho una procedura (Delphi6 in Win7 con 4 Gb) che funziona[va!] bene e  
popolava un database leggendo, passo passo, un file di testo.
Con un file particolarmente lungo (11,4 Mb) ho ricevuto un messaggio di  
[out of memory].
Qualche dritta?
Grazie per l'attenzione.
-- 
Michele Giordano


Cavolo sempre detto ... mi devo comprare la sfera di cristallo ... forse 
riesco a risolvere tutto...
qualche indicazione ?? forse memory leak di oggetti creati "al volo" e 
non distrutti ?? qualche stralcio del codice dove si blocca... un 
appiglio ....
G.

 [out of memory]. Qualche dritta?
riscrivilo.
A.

 Qualche dritta?
Hai sicuramente dei memory leaks.
Innumerevoli volte sono comparsi thread che riguardavano il debugging e 
il memory leaking, quindi non hai che da googlare un pï¿œ qui dentro.
-- 
morde
D5,D6,D7
QT 4.7.0 - MingW- QT Creator 2.1

 il memory leaking, quindi non hai che da googlare un pò qui dentro.
Grazie. Parto da qui per cercare di capire.
-- 
Michele

 Grazie. Parto da qui per cercare di capire.
I miei suggerimenti sono:
1) dotati di un buon sistema di logging (niente di complicato, basta 
fare del semplice tracing su file txt.
2) logga il costruttore e il distruttore degli oggetti coinvolti nel 
loop di caricamento
3) analizza il log per vedere se c'è disparità di chiamate tra 
costruttre e distruttore
4) fai uso di memcheck (cercalo qui dentro, si trova sotto forma di unit 
.pas da includere nel project
5) fai un lavoro che il mio ex capo chiamava "scavare la montagna, 
vangata dopo vangata": destruttura, commenta grosse parti di codice, 
anche tutta la unit e scommenta via via fino a trovare il codice 
colpevole. Parti dal grosso, e togli, togli togli fino ad aver scavato 
tutta la montagna.
In altre parole è quello che sherlock holmes continuava a ripetere 
"Quando hai eliminato l'impossibile, qualsiasi cosa resti, per quanto 
improbabile, deve essere la verità."


  
ha scritto:

Ti ringrazio molto (anche per la citazione). E' più di quanto sperassi.
-- 
Michele


Bene, non dimenticarti di darci il feedback quando hai trovato cos'è :)
ciao


 Bene, non dimenticarti di darci il feedback quando hai trovato cos'è :)
Certo.
Ho seguito il tuo suggerimento (commenta, commenta, commenta...) e sono  
arrivato a dire, con una certa sicurezza, che l'inghippo nasce in un blocco
ModuloDati.Tabella.Insert (anche Append)
...
ModuloDati.Tabella.Post
dove i puntini rappresentano le istruzioni di scrittura nei campi di  
Tabella, che ha molti record ma pochi, piccoli, campi.
Io uso Firebird 2.1.3 con i componenti standard IBX di Delphi 6 che sono  
sempre andati bene.
Cioè, sono andati bene finché non ho tentato di registrare circa 2.000.000  
di record in un colpo solo (di solito viaggio sui 300.000).
Sì, perché il mio orribile sospetto è che ci sia qualcosa che non va  
proprio negli IBX. Naturalmente, qui lo dico e qui lo nego, però se così  
fosse il problema non sarebbe di poco conto.
Se avessi più tempo vorrei provare i componenti Zeos.
Per ora - lo ammetto - ho messo le mani nel fango e ho registrato il  
documento in tre tronconi. Che vergogna!
Ciao.
Michele


Puoi provare il trittico SqldataSet+DataSetProvider+ClientDataSet e 
sparare i record in Firebird ogni 100000
G.

 sparare i record in Firebird ogni 100000
Scusa l'ignoranza, ma SqldataSet+DataSetProvider+ClientDataSet sono  
componenti Zeos?
E comunque, a questo punto, mi piacerebbe sapere se IBX ha veramente un  
problemino che si manifesta dopo un gran numero di post.
Il workaround può attendere.
Ciao.
Michele

 Il workaround può attendere.
Delphi 6 e gli IBX sono del 2001 (se non ricordo male) Firebird 2.1 del 
2009: mi sembra certo che possano esserci problemi, anche non documentati.
Non vedo altre soluzioni: aggiornati, cambia componenti o usa una versione 
di Firebird differente
Ciao
ACSH
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 Il workaround può attendere.
Ok allora fatti un classico tester con form + pulsantone che fa 1 
milione di scritture NON usando i componenti ibx.
Poi nello stesso tester aggiungi un altro pulsantone che fa 1 milione di 
insert con i componenti IBX.
Un'altro tentativo potrebbe consistere nel cambiare il provider: invece 
di usare oledb definisci un DSN con ODBC e agganciati a quello.
Un'altro ancora consiste nel cambiare relase del DB.
Un'altro ancora nel provare a cambiare la versione di delphi: ricordo 
perfettamente che il wizard di D7 per importare un WSDL mi generava 
delle classi bacate che esplodevano a runtime; migrato a D2007 il 
generatore mi creava classi del medesimo WSDL che non scoppiavano.



l'idea è buona ma io non ondrei ad aggiungere un ulteriore strato con
ODBC, meno cose ci sono in giro prima si arriva alla fonte del
problema. Non conosco Interbase ma con Mysql ho riscontrato delle
prestazioni pessime nell'approccio <insert> <post> ripetuto n.. volte
con dei tempi di esecuzione pazzeschi, mentre ripristinare interi
archivi con una procedura batch avviene in un lampo.