Jump to content
Sign in to follow this  
etr

[VB6] Caricamento file in array troppo lento

Recommended Posts

Ciao a tutti,

 

ho questo problemone ...

 

ho diversi file ognuno contentente circa 32000 righe che corrispondono a dei dati ogni minuto. Devo caricarli in diversi array differenziati per il tempo: mi spiego meglio

 

Array1 = un file (ogni posizione dell'array, una riga)

Array2 = 5 file (ogni posizione dell'array, 5 righe mediate)

Array3 = 15 file (ogni posizione dell'array, 15 righe mediate)

ecc. ecc.

fino ad un array dove ogni posizione saranno 60 righe mediate => 60 files caricati.

 

Così facendo ho un problema: il caricamento impiega 10 minuti ... minuti in cui il programma è "congelato".

 

Pensavo di delegare il popolamento degli array ad un altro programma in modo da poter continuare a lavorare con l'applicazione principale mentre gli array vengono popolati. (impiegherei comunque 10 minuti ma l'utente non se ne accorgerebbe).

 

I dati che mi servono all'inizio sono i primi caricati quindi dopo qualche secondo ...

 

Pensavo di creare un'altra applicazione che mi leggesse i file e tramite l'API SendMessage inviasse il contenuto ad una casella di testo dell'applicazione principale che si preoccuperà di copiarne il contenuto nell'array corretto.

 

Secondo voi è una soluzione percorribile ? Avete altri modi di trasferire dati tra applicazioni ?

 

Grazie !

Share this post


Link to post
Share on other sites

Pensato anche a farlo in maniera incrementale ? Ossia ogni minuto generi il file e mantieni la somma degli elementi corrispondenti. Quando son passati 5 minuti (generazione del 5° file) nell'array corrispondente metti la somma divisa per 5. In questo modo non hai l'overhead della lettura dei files, la somma è incrementale e ti serve fino al 60° file. Credo che eliminando i ritardi di I/O dovuti alla lettura dei files ogni volta, non dovresti avere latenze così drastiche.

Share this post


Link to post
Share on other sites
Ciao a tutti,

 

ho questo problemone ...

 

ho diversi file ognuno contentente circa 32000 righe che corrispondono a dei dati ogni minuto. Devo caricarli in diversi array differenziati per il tempo: mi spiego meglio

 

Array1 = un file (ogni posizione dell'array, una riga)

Array2 = 5 file (ogni posizione dell'array, 5 righe mediate)

Array3 = 15 file (ogni posizione dell'array, 15 righe mediate)

ecc. ecc.

fino ad un array dove ogni posizione saranno 60 righe mediate => 60 files caricati.

 

Così facendo ho un problema: il caricamento impiega 10 minuti ... minuti in cui il programma è "congelato".

 

Pensavo di delegare il popolamento degli array ad un altro programma in modo da poter continuare a lavorare con l'applicazione principale mentre gli array vengono popolati. (impiegherei comunque 10 minuti ma l'utente non se ne accorgerebbe).

 

I dati che mi servono all'inizio sono i primi caricati quindi dopo qualche secondo ...

 

Pensavo di creare un'altra applicazione che mi leggesse i file e tramite l'API SendMessage inviasse il contenuto ad una casella di testo dell'applicazione principale che si preoccuperà di copiarne il contenuto nell'array corretto.

 

Secondo voi è una soluzione percorribile ? Avete altri modi di trasferire dati tra applicazioni ?

 

Grazie !

 

La soluzione da te indicata a mio parere fa esplodere i tempi. Il collo di bottiglia è indubbiamente l'I/O...

Se non hai problemi di consumo di memoria e presumendo che tutti i file siano testuali puoi provare a caricare tutti i file all'interno di stringhe in un colpo solo.

lFileHandle = Freefile
Open "nomefile" For Input As #lFileHandle
sFile1 = Input(LOF(lFileHandle), lFileHandle)
Close #1

In questo modo il file viene caricato interamente ed in un sol colpo all'interno delle stringhe. A quel punto puoi lavorare sulle stringhe per tirar fuori le righe che ti interessano intercettando i CRLF.

 

Altri Tip sono:

  • Non usare la funzione Split, è lentissima
  • Dichiara le variabili numeriche sempre con LONG, occupano di più ma non subisci la lentezza dell'allineamento a 32Bit per le variabili più piccole
  • Quando usi le funzioni che operano sulle stringhe (tipo Left, Mid etc) usa sempre le varianti con il dollaro finale (Left$, Mid$ etc), sono più veloci perché non fanno uso di Variant
  • Molto importante: gli array dinamici in VB sono lentissimi, ogni volta che conosci la lunghezza massima che un array può avere dichiaralo staticamente e portati dietro una variabile per sapere quanto ne hai usato, noterai un incremento di prestazioni strabiliante

Share this post


Link to post
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
Sign in to follow this  

×