Newsgroup: it.comp.lang.c
Titolo: Archiviare dati in velocità

Non seguo da molto il NG, per cui spero di non essere OT.
Il mio problema è questo:
- devo archiviare dati sottoforma di sequenza di strutture.
- I valori per riempire una struttura mi arrivano ogni 10 microsec (circa).
- Non so a priori quante variabili struct allocare
- Data l'elevata velocità a cui deve essere eseguita l'operazione di storage
(una struct ogni 10 microsec) pensavo di non effettuare un accesso al file
per ogni struct, ma usare una sorta di buffer di memoria.
- E' fondamentale l'elevata velocità (scusate se mi ripeto)
Qualcuno sa darmi qualche consiglio per implementare questa struttura dati?
TIA

RoBo wrote:

La soluzione migliore e' quella di tenere tutto in memoria fino ad un certo 
limite (che scegli tu) e periodicamente effettuare un dump su file (nota, 
che non e' detto che il dump avvenga realmente su file nel momento in cui 
lo fai). Usa la RAM finche' ti e' possibile... se inizia a swappare le 
prestazioni calano, quasi come se dovessi fare I/O direttamente su file... 
non esagerare con la dimensione del buffer quindi :)
Se procedi cosi', puoi gia' decidere in partenza la dimensione del tuo 
buffer di strutture, evitando il costo di un'allocazione dimanica man mano 
che ne hai bisogno.
Ci sono almeno 2 problemi:
1) sei sicuro che il programma riesca a campionare tutti i dati in arrivo? 
Se ne perde qualcuno restano in un buffer o vengono persi? Effettua del 
test per assicurarti che il programma riesca a campionare.
2) quando fai I/O bloccante, il programma potrebbe restare in attesa, 
assicurati che questo lag non comporti perdita di dati.
Per i dettagli poi rivolgiti ad un gruppo specifico per la programmazione 
sotto il sistema operativo su cui funzionera' il programma (potresti avere 
la necessita' di uno scheduler RT, potresti dover modificare la priorita' 
del tuo programma, etc).
-- 
Mox
"Trust the programmer."
"Don't prevent the programmer from doing what needs to be done."
"Keep the language small and simple."
"Provide only one way to do an operation."

"Mox" <m...@invalid.mail> ha scritto nel messaggio
news:YYSla.30666$iy5.8...@twister2.libero.it...


Grazie Mox per i tuoi consigli, e scusa se approfitto ancora:
secondo te, quindi, è preferibile un buffer di strutture di dimensione
prefissata (penso ad un array) ad un qualcosa (penso ad una lista collegata)
che usi la memoria finchè è possibile?
Rinnovo i miei ringraziamenti.
RoBo

 per ogni struct, ma usare una sorta di buffer di memoria.
Qui mi sa che l'I/O convenzionale del C e` meglio lasciarlo stare, e 
(posto che tu sia su un sistema Unix) andare di  mmap(2) e msync(2).
-- 
   |   \    \  | ___|_  |_  | ianezz a casa sua... :-)
   |  _ \  | \ | _|    /   /  Visita il LinuxTrent a
  _|_/  _\_|  _|____|___|___| 
http://www.linuxtrent.it

 collegata) che usi la memoria finchè è possibile?
Prima di tutto ascolta i consigli che ti sono stati dati e cerca qualche 
modo piu' efficiente per fare I/O. Se lavori sotto Linux guarda 
http://www.lilik.it/~mirko/gapil/gapilsu171.html#x420-21800011.1.5
Per i dettagli pero' siamo OT.
Meglio scegliere una dimensione fissa e lavorare su quella. La lista va bene 
finche' non sai quanti elementi ti arrivano o se devi spostare parti di 
questa, e' praticamente inutile nel tuo caso.
Quando il buffer e' pieno fai un flush dei contenuti e ricominci a leggere.
La chiama di mmap che ti e' stata suggerita evita che tu debba usare un 
buffer intermedio, ma lo gestisce il sistema in modo trasparente struttando 
lo stesso meccanismo della paginazione se ho capito bene. Probabilmente 
sentiresti maggiormente i vantaggi della mmap se dovessi scrivere e leggere 
"saltando" in vari punti del file piuttosto che scrivendo in append.
