Newsgroup: it.comp.lang.vo-clipper
Titolo: ottimizzazione funzione

salve a tutti,
devo ottimizzare una funzione che ho scritto diverso tempo fa.
ecco a grandi linee il funzionamento:
function dupkeys(cNomeFile,cChiave,cOperazione)
dove [cNomeFile]   e' il nome del file .DBF in input,
     [cChiave]     e' la chiave dell'indice
     [cOperazione] e' il tipo di operazione da effettuare sul file
[cOperazione] puo' assumere 2 valori: "C" o "M"
- parametro "C" -
con "C" (copia records) la funzione genera un file di output con la stessa
struttura di quello di input, all'interno della quale copia tutti i records
con chiave uguale.
se il file di input e' cosi' composto:
|--------|--------|--------|--------|
| chiave | campo1 | campo2 | campo3 |
|--------|--------|--------|--------|
| abc    | alfa   | alfa   | alfa   |
| abc    | beta   | beta   | beta   |
| def    | gammma | gammma | gammma |
| def    | delta  | delta  | delta  |
| xyz    | alfa   | alfa   | alfa   |
|--------|--------|--------|--------|
il file di output sara':
|--------|--------|--------|--------|
| chiave | campo1 | campo2 | campo3 |
|--------|--------|--------|--------|
| abc    | alfa   | alfa   | alfa   |
| abc    | beta   | beta   | beta   |
| def    | gammma | gammma | gammma |
| def    | delta  | delta  | delta  |
|--------|--------|--------|--------|
il record con chiave "xyz" manca perche' ha una chiave univoca all'interno
del
file
- parametro "M" -
con "M" (muovi records) la funzione si comporta come per il parametro "C",
ma oltre a copiare nel file di output i record con chiave uguale,
contestualmente va a cancellare, sul file di input, i records con chiave
uguale.
se il file di input e' cosi' composto:
|--------|--------|--------|--------|
| chiave | campo1 | campo2 | campo3 |
|--------|--------|--------|--------|
| abc    | alfa   | alfa   | alfa   |
| abc    | beta   | beta   | beta   |
| def    | gammma | gammma | gammma |
| def    | delta  | delta  | delta  |
| xyz    | alfa   | alfa   | alfa   |
|--------|--------|--------|--------|
il file di output sara':
|--------|--------|--------|--------|
| chiave | campo1 | campo2 | campo3 |
|--------|--------|--------|--------|
| abc    | alfa   | alfa   | alfa   |
| abc    | beta   | beta   | beta   |
| def    | gammma | gammma | gammma |
| def    | delta  | delta  | delta  |
|--------|--------|--------|--------|
e il file di input, dopo la cancellazione dei records con chiave "doppia"
sara':
|--------|--------|--------|--------|
| chiave | campo1 | campo2 | campo3 |
|--------|--------|--------|--------|
| xyz    | alfa   | alfa   | alfa   |
|--------|--------|--------|--------|
...spero di essere stato chiaro :)
la mia funzione si comporta in questo modo:
-apertura file di input
-scorrimento di tutti i records con un ciclo DO WHILE !EOF()
 e marcatura, tramite DELETE, dei records con chiave "doppia"
-copia sul file di output dei records con DELETED()==.T.
-RECALL ALL sul file di input (per il parametro "C") -OPPURE-
 PACK sul file di input (per il parametro "M")
-chiusura file di input
-apertura file di ouput
-RECALL ALL sul file di output
-chiusura file di output
per file abbastanza piccoli non c'e' problema di velocita' ma quando si
tratta
di files abbastanza grandi (intorno al milione di records) iniziano i
dolori...
il sorgente lo avevo scritto in Clipper 5.2e con indici NTX, ora l'ho
adattato
facilmente per xHarbour e indici CDX.
un incremento di velocita' c'e' stato, ma non abbastanza :(
accetto consigli, suggerimenti o algoritmi alternativi per migliorare le
prestazioni della mia funzione, magari utilizzando anche le nuove
caratteristiche di xHarbour... (che ho scoperto relativamente da poco e
del quale non conosco a fondo le potenzialita')
ciao e grazie!

 dolori...
Prova a fare prima una copia dell'archivio e dell'indice (COPY FILE) e
poi sulla copia cancellare tutte le chiavi ripetute.
EMG
--
EMAG Software Homepage:     
http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: 
http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: 
http://www.emagsoftware.it/tbosg

Se l'archivio sorgente è molto grande, cerca di percorrerlo una sola volta.
Non dovrebbe essere difficile nemmeno scrivere una funzione di RollBack nel
caso si piantasse a metà la transazione...
Ciao
Massimo

grazie per i suggerimenti, iniziero' a fare qualche test...