Cattiva free() e OpenOffice
Vernia Damiano
melkor.x a tiscali.it
Ven 1 Ago 2003 18:58:57 UTC
Rispondo a tutti qui perche' siete stati cosi' gentili da
rispondermi in tantissimi :-))
>>> giustificare la grande quantita' di RAM usata. Credete che allocare e
>>> deallocare sempre e solo blocchi delle medesime dimensioni possa
>>> migliorare questo aspetto?
>> Non penso, acnhe se non ho mai fatto esperimenti specifici.
>> L'operazione di free e' piuttosto costosa in termini di risorse...
> Non so se me lo sono sognato adesso o se l'ho letto da qualche parte. Puo'
> darsi che tutte le free vengano rimandate sino a quando la memoria non e'
> piena.
Io non ho idea di quale caso sia avvenuto, so solo che col mio
programma arrivavo ad occupare anche piu' di 100MB di ram nonostante
facessi tutte le free() per bene. Di questo ne sono sicuro. Ammetto di non
aver indagato piu' a lungo la questione di mmap e dei chunk di memoria
visti da glibc (premessa: lavoro con RH7.1/RH7.3 su PC AMD/Intel), ma
pensavo che il problema fosse del tipo indicato da Giuzzi con l'esempio
delle malloc().
>> la questione del "riordino" dei chunk inutilizzati e' abbastanza complessa
In realta' pensavo ai blocchi visti "linearmente" dal mio
programma, non alle pagine da 4kB gestite dal processore. Credo appunto
che in questa visione "lineare" della memoria del processo si creassero
dei buchi poi effettivamente inutilizzabili e per questo le malloc()
successive passassero sempre piu' avanti.
>> Opterei per una sorta di meccanismo di caching che evita di effettuare free
>> finche' e' possibile.
Ho fatto qualcosa di simile allocando all'inizio del programma
tutte le strutture temporanee che servono anche nei suoi moduli (e di cui
al compile-time non conosco la dimensione, e' ESCLUSIVAMENTE per questo
che sono costretto ad usare malloc()). In questo modo ho ridotto
drasticamente il numero di malloc()/calloc() e free() nel funzionamento
"vero" del programma.
>> Anche a me e' successo: una volta ho allocato quasi un giga di ram
>> (e le free c'erano tutte...)
Questo e' consolante, veramente. Soprattutto perche' sono
praticamente sicuro che le free() le ho fatte tutte: non immaginate
nemmeno quanto tempo ho impiegato per rendere "modulare" il programma e
per fare in modo che la memoria allocata venisse deallocata correttamente.
E' stato lo sforzo maggiore, perche' per il resto l'algoritmo e'
si' complicato, ma non tanto da far impazzire.
> AFAIK si puo' usare la glib che ha appunto un meccanismo interno di caching
> di malloc e free.
Puo' darsi, non so. Comunque alla fine della fiera ho impiegato
una giornata e ho modificato leggermente le strutture dati e i moduli di
piu' basso livello del mio programma. malloc() e free() ora sono molte
meno (anche se ho dovuto sostituirle con alcune memcpy()) e soprattutto,
dati i parametri nell'istanza del problema da analizzare, sono di
dimensioni fisse e fatti dopo l'allocazione di tutte le altre strutture di
diversa dimensione.
Risultato: da qualche decina/centinaia di MB di ram utilizzati (e
costantemente in _lenta_ ma inesorabile crescita) sono passato a 600/700
KILO byte, dimensione ragionevole stimando la dimensione dell'istanza del
problema. Mi ripeto, sono praticamente sicuro di aver allocato e liberato
la memoria correttamente, a questo punto credo (come suggerisce anche
Erix) che sia davvero un problema dell'allocatore (della glibc, non del
kernel che lavora per pagine e non gliene frega niente dell'algebra
lineare dei puntatori).
Spiegazione che mi do: E' vero tutto quanto e' stato detto, a
partire dai pezzi non riutilizzati da malloc() come suggerisce Giuzzi
fino al caching della memoria utilizzata come ha detto Cowo. Ammetto che
puo' essermi sfuggito qualche free(), anche se immagino di entita' tanto
piccola (si parla di qualche - < 10 - unsigned a volta) da non
giustificare crescite cosi' enormi di memoria.
Grazie mille a tutti!!!!
--
Ciriciao
LtC. Melkor?! B. Xapatan
PS: Adesso come adesso per mio padre ho installato l'OpenOffice per
losezozz presente sul CD del Lug CD032-2 (e per questo mi ero rivolto al
Lug) perche' con un 33.6 non mi passa nemmeno per l'anticamera del
cervello di scaricare l'ultima versione. In ogni caso, come suggerisce il
gelma, mi scarico l'ultima versione appena torno in universita'. Grazie
anche per questi suggerimenti e per le esperienze riportate.
Maggiori informazioni sulla lista
Lug
|