Newsgroup: it.comp.lang.delphi
Titolo: Utilizzo memoria oltre 2GB

Avevo fatto un applicativo che faceva una serie di calcoli prendendo i dati
da un db, li elaborava e poi riscriveva i parziali su db. Il problema di
questo è che era estremamente lento (in particolare le insert sul db).
Si è deciso di portare il tutto in memoria. Al momento utilizzo per la
maggiore TObjectList.
Allo stato attuale, da un cliente di medie dimensioni, il programma
all'apice arriva ad occupare dai 400 ai 600 mega di ram.
Ho la preoccupazione che facendolo girare da un cliente che ha una mole di
dati molto più grande arrivi al limite dei 2 gb di ram per processo.
Non posso mettermi a riscrivere i dati su db in quanto rallenterei le
operazioni.
Il programmma è già stato testato con memproof, quindi esente da memory
leak.
Sull'MSD ci sono delle api che fanno riferimento al PAE per allocare memoria
oltre i 2 gb.
Il problema è io utilizzo tutte le allocazioni di memoria fatte da
TObjectList & co. quindi risulta complicato andare ad usare queste api.
Qualcuno ha già affrontato il problema?
Eventualmente riscrivendo in proprio il memory manager basandosi su qualcosa
di simile a FastShareMem potrebbe andare?
Grazie.

Sam ha scritto:

Versione di Delphi? Sistema Operativo sul quale dovra' girare
l'applicazione? Tipo dei dati: stringhe, interi, record, oggetti, ecc...?
Che elaborazioni fa il programma di questi dati? Usate gli algoritmi
migliori per tali applicazioni? Usate routine di Delphi che possono essere
sostituite con versioni piu' "performanti" in assembler?
FastShareMem serve se passi i tuoi dati in memoria attraverso DLL,
altrimenti non ti puo' aiutare.
Riscrivere il memory manager mi sembra davvero arduo: usi gia' FastMM?
Meglio di questo e' davvero complicato fare qualcosa ...
Di piu', non so.
Ciao
ACSH
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 operazioni.
Perchè non swappi parzialmente su HD ? Quali limitazioni ci sono a
riguardo ?

 Riscrivere il memory manager mi sembra davvero arduo: usi gia' FastMM?
No, normalmente uso la ShareMem di delphi

con che frequenza viene eseguita questa elaborazione?
Da quanti utenti in contemporanea?
A.

 riguardo ?
Brevemente  gli oggetti dentro a queste ObjectList, si referenziano tra di
loro attraverso dei puntatori.
Se eliminassi dalla lista un elemento per swapparlo su disco (a parte il
dover crearmi tutta una serie di classi per la memorizzazione dei dati), gli
altri oggetti che ho in giro per la memoria e che puntavano a questo
oggetto, non punterebbero piů a nulla. In pratica ho in memoria una "specie
di grafo". Sono ricorso all'uso dei puntatori per avere un'accesso diretto
ai vari oggetti in memoria senza dover fare per ogni lista ricerche binarie
ecc. che avrebbero rallentato.

 Da quanti utenti in contemporanea?
Normalmente viene eseguita da 1 utente alla volta.
Attualmente gira la notte e in pausa pranzo.
Lo scopo di questa versione "in memoria" è quello di presentare una prima
elaborazione con i dati nel database, poi dare all'utente di fare alcune
variazioni su determinati parametri, rifare il calcolo "quasi in tempo
reale" e mostrare il risultato in modo da poter fare simulazioni in tempi
decenti.
Per questo è utile che tutta la parte di anagrafiche (che impiega un po' di
tempo a essere caricata) rimanga sempre in memoria.

..quindi è un batch.
domanda scema: usare stored procedure?
A.

decenti.
L'idea di Alberto non è da scartare: hai valutato la possibilità di
stored procedure?

 domanda scema: usare stored procedure?
Le stored procedure le abbiamo già utilizzate in altri casi con successo, ma
qui per il tipo di programma non sarebbe fattibile la cosa. Per uscirne
quasi sano di mente anche nella versione "su db" avevo dovuto usare in modo
pesante classi, ereditarietà ecc.
Senza contare che da quello che so io le stored procedure su sql server non
sono facilmente debuggabili.

 sono facilmente debuggabili.
ho personalmente sviluppato un sistema di consolidamento dati su db
sqlserver 2000 basato TOTALMENTE su stored procedure...
Il processo viene tutt'ora eseguito ogni notte alle 03:00 e dura circa
2 ore.
Ho avuto casini per i cursori che sono notoriamente lenti ma non sul
debug delle stored procedure.
A.

 sono facilmente debuggabili.
Cioč? che intendi?


 Cioè? che intendi?
Intendo dire che oltre un certo punto di complessità per le stored procedure
diventa complicato se devi fare il debug, in quanto mi risulta soltanto che
per controllare l'esecuzione hai solo la PRINT/profiler, sql server almeno
non ti fornisce uno strumento che ti permetta l'esecuzione passo passo della
stored procedure quando hai dichiarato variabili o cursori.
Sinceramente però non ho neanche mai cercato se esistono tool di terze parti
utilizzabili allo scopo.
Ritornando invece al problema, diciamo che per il momento mi salvo in quanto
l'applicazione supera il giga di memoria, quindi ho ancora abbastanza
spazio.
Mal che vada, ho trovato scritto che facendo l'override di NewIstance e
FreeIstance (peccato siano scritte in assembler che non conosco), si riesce
ad allocare la memoria utilizzando le funzioni che si preferisce, quindi
teoricamente posso utilizzare le api di window per l'awe.
Intanto grazie a tutti. Se poi vi viene in mente qualcos'altro fate un
fischio.

 teoricamente posso utilizzare le api di window per l'awe.
C'č ancora qualcosa che non mi torna. Non penso che tu abbia esigenze cosě
particolari da non poter riuscire a trovare una soluzione "plain", ma
purtroppo dici troppe poche cose del tuo problema.


sara' l'eta' o il clima impazzito ma a me sembra di ricordare che da
queryanalyzer si riusciva ad eseguire una stored procedure step by
step....
A.

 step....
Sě, infatti č possibile.


 step....
Scusate, non l'avevo mai visto.
Grazie per la dritta.