Newsgroup: it.comp.programmare.win32
Titolo: uso di CMap e problemi di memoria

sto cercando si scrivere un prog che,a partire da un file di testo, generi
un vocabolario. Ho suddiviso il prog. in due fasi distinte /(speigo ora la
prima fase, la seconda semmai in un'altra e-mail...)
Dunque, prima legge un file di testo e lo memorizza in un CString, quindi
cerca gli spazi e i '\n' e spezzetta la stringa. Quindi memorizza le
stringhe così estratte in una CMap (map1). Lo stesso per il file del
dizionario che genera una map2. (la seconda fase deve occuparsi di
"ripulire" queste stringhe da tutti i segni di punteggiatura, parentesi, ecc
ecc)
Poi confronta map1 con map2 e aggiunge a map2 tutte le voci in map1 ( quindi
quelle uguali vengono sovrascritte, o meglio le salta...). Alla fine salva
su file la map2.
Ora i problemi sono questi:
1) la stringa iniziale (m_file) nella quale memorizzo prima il nuovo file e
dopo il file del dizionario è esageratamente grande e oltre 100k le
prestazioni degradano esponenzialmente!
E' un problema di memoria, di puntatori, una CString ha dei limiti...???
c'è un modo migliore (sicuramente c'è) per leggere un file di testo e
spezzettarlo.
una dubbio tremendo che mi sorge ora, ma usando CFile il file viene caricato
in memoria o no? ovvero usando file.Seek deve essere in memoria, se è così
usare una Cstring per leggerlo è una puttanata! )
per questo ho usato un sistema alquanto scomodo, ovvero controllo quando
questa stringa m_file > 50k, in quel caso procedo subito a popolare la mappa
(sia nel caso di map1 che map2), poi metto m_file ="" e ricomincio! le
prestazioni in questo modo sono costanti ma la scomodità è tanta, in quanto
devo assicurarmi di leggere il file sino ad un carattere " " o "\n" e
ricominciare esattamente da lì !!!
2) il secondo problema è che dopo aver aggiunto il nuovo file al dizionario,
metti caso che uno ne vuole aggiungerne un'altro. Bene, cancello map1 ma
map2 la lascio (dopo tutto quello che mi è costato a crearla!). Il problema
è che, attualmente il file del dizionario contiene già circa 30000 voci e
questo occupa memoria! Avendo "soltanto" 64MB il pc inizia ad usare il file
di swap, che cresce lentamente ma inesorabilmente! Come posso fare?
Ovvero anche se libero la memoria il programma continua ad usare lo swap!
( e poi, con un calcolo approssimativo 30000 voci * 10 caratteri in media
per voce * 1 byte per char (o no?) = 300 k, ed in effetti è la grandezza del
file diz.txt !!! ma quando chiudo il programma vengono liberati 10MB di
ram!!!!)
PS. scusate se sono stato lungo, ma proprio non riesco ad essere conciso!
grazie a tutti per le risposte e la pazienza

 ram!!!!)
Forse hai dei memory leaks (ossia ti dimentichi di deallocare qualcosa)?
Sicuramente CMap occupa piu` memoria di quanto occuperebbero i dati "grezzi"
che contiene (e` pur sempre un hash), ma cosi` tanto di piu` non credo. Opto
per un qualche tuo errore di programmazione.
---
Bye! Lorenzo Lutti
http://antani.virtualave.net/


questo ok, lo devo riguardare. Non dealloco niente, però non uso mai nemmeno
new, quindi in pratica in memoria dovrei avere soltanto un'istanza di ogni
voce del
dizionario e le varie liste che uso sono soltanto puntatori a queste voci, o
no?
ma cmq il problema è un'altro (l'ho notato usando sysmon su WinMe), e cioè
che una
volta che il programma ha iniziato ad usare lo swap (quando la ram è
finita), dopo, anche se
libero la ram il prog. continua ad usare lo swap mentre la ram rimane
costante!


 costante!
Questo e` un problema imputabile piu` a Windows che al tuo programma. :)
