PDA

Visualizza la versione completa : [c] file con record di lunghezza variabile.


zaion
04-08-2003, 13:53
ho creato un programma che gestisce un archivio. le
informazione di ogni singola voce sono contenute in
un record di lunghezza fissa, ed il file è ad accesso
casuale. Questo è un vantaggio perchè mi permette di
accedere rapidamente ad un record conoscendone solo
il numero progressivo.
Però adesso voglio cambiare la struttura del record
aggiungendo una lista di stringhe ad ogni elemento.
la dimensione del record quindi varia a seconda del
numero di stringhe inserite dall'utente.

avete qualche consiglio/idea su come gestire una situazione
del genere?

giorgino
04-08-2003, 15:50
senti, le soluzioni secondo me possono essere solo due, dato un archivio deve avere un tracciato record ben definito:

1) o prendi il record con + campi e ridimensioni gli altri con lo stesso numero di campi (secondo me idea pessima).

2) ti crei un nuovo archivio figlio (stringhe) e lo colleghi all'archivio padre collegandolo per il progressivo.
quindi sul padre avrai

progressivo numerico
altri campi

sul figlio invece

progressivo figlio numerico
progressivo padre (chiave secondaria di collegamento).
altri campi

Ciao

Giorgino

zaion
04-08-2003, 16:28
prendo direttamente in esame il secondo metodo.
come idea non è male, di solito si usa con i database.
il problema è che mi rallenta il caricamento. mi spiego.

attualmete il record lo carico posizionandomi direttamente
nel file attraverso un metodo 'seek(long pos)' utilizzando
un particolare algoritmo che mi permette di accedere al mio
record a colpo sicuro. cioè senza dover leggere nessun altro
record prima.

con il metodo che dici tu invece devo caricare l'archivio
'stringhe' con un accesso sequenziale perdendo molto
in velocità. :stordita:

qualche altro consiglio per migliorare questo algoritmo?

ChReAn
04-08-2003, 16:56
Non credo ci sia modo di fare ciò che dici (da quel che ho capito vorresti fare la ricerca con seek anche sul secondo file), ma forse puoi velocizzare la ricerca indicizzando il secondo archivio e, perchè no, anche il primo, con una struttura di tipo btree.
In fondo questo è anche il metodo utilizzato dai db. Potresti dare un'occhiata ai sorgenti di postgresql per vedere come viene eseguita questa operazione. :p
A meno che... A meno che... POtresti semplificarti la vita se tu facessi in modo di avere il secondo file SEMPRE ordinato per chiave, così da cercare il primo record afferente alla chiave corrente del primo file, e poi ciclare fino a quando trovi record che soddisfano la chiave stessa.

Esempio:



typedef struct prima{
int key;
} Prima;

typedef struct seconda{
int key;
int riga;
} Seconda;


E in pseudocodice:

seconda.key = prima.key;
for (seconda.riga = 1; riga_trovata; seconda.riga++)
{
carica_seconda ();
}

Naturalmente la condizione trovata sarebbe qualcosa tipo

seconda.key == prima.key


Per poter essere sicuro della riuscita di questo metodo dovresti indicizzare il file ed accedervi in base all'indice, oppure inserire ogni record del secondo file già nella posizione corretta (più semplice, ma dovrebbe inficiare le prestazioni in inserimento).

:ciauz:

giorgino
04-08-2003, 17:06
anche qui ci sono 2 modi:

1)
per fare le cose al meglio dovresti ordinare per chiave secondaria (la chiave del padre) l'archivio figlio.

Facendo questa operazione dovresti ottenere:

apro record archivio padre.

ordino archivio figlio per chiave archivio padre.

seek su primo record archivio figlio.

ciclo fino a rottura chiave: (figlio -> chiave archivio padre <> padre -> chiave)

In questo modo ottieni le massime prestazioni possibili.

2)

Ti crei un elenco unico contenente N record di archivio figlio x M record di archivio padre (come se fosse una join tra tabelle relazionate) e ci fai quello che vuoi sopra a quel punto (+ o - è la stessa cosa, è peggio alla 1 per certe cose, ma meglio x altre).



Dipende da ciò che ci devi fare.

Comunque sceglierei la 1)

Giorgino

zaion
04-08-2003, 17:13
ok, adesso mi metto a pensarci, ma credo che userò un archivio
ordinato.
dovrebbe essere la soluzione migliore, tutto sommanto.

zaion
04-08-2003, 17:24
@ChReAn: cosa intendi per struttura btree?
un albero binario?
e come si memorizza in un file? :master:

ChReAn
04-08-2003, 17:33
Originariamente inviato da zaion
@ChReAn: cosa intendi per struttura btree?
un albero binario?
e come si memorizza in un file? :master:

Sì, un btree è un albero binario.
Solitamente i dbms memorizzano un file per ogni tabella e a ognuno di questi file associano N file, uno per ogni indice. Non credo però che sia indicato mettersi a riscrivere un piccolo dbms nel tuo caso: l'approccio che io e giorgino ti consigliavamo (quello della lettura sequenziale da un archivio ordinato) dovrebbe fare al caso tuo.

Ti consigliavo l'uso dei btree per l'ordinamento perchè, ad esempio, alcuni software di creazione dizionari (per cracking) si servono di questo tipo di struttura per scrivere un elenco ordinato di grosse dimensioni.

:ciauz:

Loading