Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di zaion
    Registrato dal
    Mar 2002
    Messaggi
    258

    [c] file con record di lunghezza variabile.

    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?
    bye bye

  2. #2

    ma.....

    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

  3. #3
    Utente di HTML.it L'avatar di zaion
    Registrato dal
    Mar 2002
    Messaggi
    258
    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à.

    qualche altro consiglio per migliorare questo algoritmo?
    bye bye

  4. #4
    Utente di HTML.it L'avatar di ChReAn
    Registrato dal
    Aug 2002
    Messaggi
    486
    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.
    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:

    codice:
    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).

    ChReAn
    -------------------

    Slackware 9.1 powered

  5. #5
    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

  6. #6
    Utente di HTML.it L'avatar di zaion
    Registrato dal
    Mar 2002
    Messaggi
    258
    ok, adesso mi metto a pensarci, ma credo che userò un archivio
    ordinato.
    dovrebbe essere la soluzione migliore, tutto sommanto.
    bye bye

  7. #7
    Utente di HTML.it L'avatar di zaion
    Registrato dal
    Mar 2002
    Messaggi
    258
    @ChReAn: cosa intendi per struttura btree?
    un albero binario?
    e come si memorizza in un file? :master:
    bye bye

  8. #8
    Utente di HTML.it L'avatar di ChReAn
    Registrato dal
    Aug 2002
    Messaggi
    486
    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.

    ChReAn
    -------------------

    Slackware 9.1 powered

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.