Newsgroup: it.comp.lang.delphi
Titolo: ottimizzazione elaborazioni

Ho un array di record letto da db. Il numero di record varia dai 1.000 ai
100.000.  Carico i record in memoria, esattamente in un oggetto TList.
Successivamente inizio ad eseguire una serie di ricerche da cui mi creo
altri 2 array con altrettanti record valorizzando altre 2 TList. Se lavoro
con un miliaio di record non ho problemi di memoria. Se già vado oltre i
2000, dopo un po di elaborazione mi esce il classico errore "out of memory".
Come potrei ottimizzare il tutto?
Risolverei il problema se anzicchè archiviare i risultati in memoria nei 2
oggetti TList gli archivio su file o in una tabella del db? Secondo me il
risultato è lo stesso dato che sarò sempre costretto a caricarmi tutti i
dati archiviati per eseguire le varie elaborazioni.
Grazie.

 ha scritto nel messaggio news:41ecd87b$1...@x-privat.org...


dati archiviati per eseguire le varie elaborazioni.
Ciao Jak,
secondo me l'approccio di leggere tutti quei record in memoria non č
corretto, dovresti vedere se il db ti consente ( via query ) elaborazioni
che faresti con le TList. Intanto potresti indicare il tipo di db che stai
utilizzando e che tipo di ricerche devi fare cosě da poterti aiutare in
modo mirato.
Ciao da Enrico Giudici
ico...@tiscali.it
--- posted by geoForum on 
http://www.delphiedintorni.it

 oggetti TList gli archivio su file o in una tabella del db?
Dipende dalle operazioni che fai.  L'accesso ai dati in memoria è
sicuramente molto più efficiente che l'accesso al disco (che notoriamente
è una delle operazioni più lente).  Il DB organizza i dati per indici e
quindi può rendere le ricerche molto più veloci, quindi se il numero di
record non è basso (100.000 già mi sembra una buona soglia per usare il
DB) puoi ricorrere a un db, altrimenti una TList va più che bene.  Se
esegui degli scorrimenti, però, la memoria è comunque più efficiente.  Il
problema, in questo caso, è la quantità di dati immagazzinabile, che ti
farebbe preferire un db.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 utilizzando e che tipo di ricerche devi fare così da poterti aiutare in


 memory".
Duemila elementi sono un pò pochini per andare già in "out of memory". 
Immagino tu carichi in memoria una struttura tipo _record_, quindi prova i 
prima battuta a strutturarlo in modo da avere i soli campi necessari alla 
tua elaborazione ed i tipi dati degli stessi il più possibile congruenti con 
i dati che devono contenere, magari provando anche a valutare l'uso delle 
ShortString (che sono meno dispendiose).
L'oggetto TList "costa" un pò di piu' in termini di memoria, rispetto al 
classico uso dei puntatori. Potresti provare "alla vecchia", creandoti 
manualmente una lista da scorrere.
Solito discorso:
type
PRecord = ^TRecord;
TRecord = record
  ...
  campi dati
  ...
  precedente: PRecord;
  prossimo: PRecord;
end;
Dove _precedente_  potrebbe essere omesso se pensi di scorrere solo in un 
senso.
Le solite variabili, per memorizzare l'indirizzo del primo elemento e per 
scorrere la lista:
var
PrimoRecord: PRecord;
CorrenteRecord: PRecord;
ecc.
Piu' l'uso di New() e Dispose()
Inoltre, invece di duplicare i record nelle altre due liste (quindi, alla 
peggio, rischiando di triplicare la memoria occupata), potresti seguire la 
stessa tecnica, modicando la struttura del TRecord:
TRecord = record
  ...
  campi dati
  ...
  precedente: PRecord;
  prossimo: PRecord;
  lista1Precedente: PRecord;
  lista1Prossimo: PRecord;
  lista2Precedente: PRecord;
  lista2Prossimo: PRecord;
end;
in modo da occupare solo la memoria necessaria ai quattro puntatori per ogni 
elemento (sempre con il vincolo che _listaXprecedente_ sia effettivamente 
necessario).
E quindi crearti le variabili necessarie per puntare all'inizio delle due 
liste e tutte quelle di supporto per lo scorrimento.
Ciao,
Gianluca. 

 ha scritto nel messaggio news:41ecd87b$1...@x-privat.org...
