linux user group brescia

immagine del castello

Archivio della mailing list

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