Newsgroup: it.comp.lang.visual-basic
Titolo: scansione grosso file di testo, lo faccio in VB?

ciao a tutti, eccovi il mio quesito...
devo scrivere un programmino in vb, che genera a partire da una serie
di dati un file di testo formato da campi separati da una virgola,
questo non mi preoccupa piu' di tanto, ma poi il programma deve
prendere il file cosi' creato e aggiornare con questi dati un altro
file dello stesso formato, sostanzialmente deve leggere il primo campo
(che permette di identificare il record) e controllare se e' gia'
presente nell'altro file oppure no, se non c'e' deve accodarlo.
siccome probabilmente il programmino dovra' gestire moli significative
di dati, mi chiedevo se non mi conviene fare un programmino in c che
va + veloce che provveda solo all'aggiornamento, e farlo lanciare dal
mio programmino in vb. Quanto guadagnerei in termini di prestazioni? 
inoltre, qual'e' secondo voi il metodo migliore di analizzare i dati?
faccio due enormi cicli tipo
leggi un dato 
confrontalo con tutti
leggi il secondo
confrontalo con tutti
ecc?? viene un numero di iterazioni spaventoso!!
meew che ha visto quanta gente ha ringraziato murialdo, ed e' felice.

 wrote:
ho scritto qual e' con l' apostrofo. chiedo perdono
meew ignorante

 meew che ha visto quanta gente ha ringraziato murialdo, ed e' felice.
Mi associo.
--
Ciao.
Maurizio
--------
?SPQR(C)
 X
--------

 di dati, mi chiedevo se non mi conviene fare un programmino in c
Ma non č meglio importare i dati in Access e indicizzarli?
Eventualmente puoi farlo anche da codice. Ti crei 2 tabelle tabella nuove,
importi i due files di testo e li indicizzi, e poi fai tutto con le join.
Alla fine esporti di nuovo tutto in formato comma delimited.
Secondo me, se i files sono veramente grandi, ti conviene.
Ciao
*Roby*

 ha scritto nel messaggio
news:ffrjdt4902brdd73s...@4ax.com...


 ecc?? viene un numero di iterazioni spaventoso!!
certo se devi cercare 100.000 record tra altri 100.000 con la mia struttura
sono 2 0 300.000 secondi  circa 83 ore :))
Ciao stefano

aggiungo che non uso indici e i record sono a lunghezza fissa.
eh, non credo 20 mb... il fatto e' che questa lista cresce lentamente,
ma cresce... non credo che ci si debba preoccupare di avere file + di
10 mb... e gli altri sono tipo 5000 al massimo... solo che non ho
messo record a lungheza fissa... quindi non posso accedere random....
devo leggere tutta la riga...
cmq anche visti i + recenti problemi (ho mandato un altro mex x i
nuovi dubbi...) mi sa che faccio un db... anche se non so come si fa!!
meew  che pensava di metterci pochissimo a fare questo programma, e
invece ci sta mettendo troppo.

 sufficientemente veloci, ma dipende da quanti record hai da confrontare. Ho
In quanto alla velocita' della lettura/scrittura ho fatto la seguenete prova.
Preso un file di testo di 42'000'000 byte (1'000'000 di linee di 42 byte), ho scritto dei programmini per leggerlo in alcuni linguaggi e ho confrontato i tempi.
Questi i risultati
codice c++
#include <windows.h>
#include <fstream.h>
#include <stdio.h>
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
	DWORD st, et;
	char s[200];
	ifstream i("a.txt");
	st = GetTickCount();
	while (!i.eof()) i >> s;
	et = GetTickCount();
	i.close();
	sprintf(s, "%d\n", et - st);
	MessageBox(0, s, "", 0);
	return 0;
}
tempo 1:55
codice VB
Sub Main()
   Dim fi As Integer
   Dim r As String
   Dim start As Date
   Dim sstop As Date
    fi = FreeFile
    Open "a.txt" For Input As fi
    start = Time
    Do While Not EOF(fi)
        Line Input #fi, r
    Loop
    sstop = Time
    Close fi
    start = sstop - start
    MsgBox start
End Sub
tempo (in compilato) 0:58
codice pascal (x dos)
uses date;
var
   fi:text;
   r:string;
   start,stop:datiora;
begin
   assign(fi,'a.txt');
   reset(fi);
   getora(start);
   while not eof(fi)
   do begin
         readln(fi,r);
      end;
   getora(stop);
   close(fi);
   sottraiora(stop,start,start);
   writeln(strora(start,concentesimi));
end.
tempo 0:22
a voi i commenti

aggiungo che non uso indici e i record sono a lunghezza fissa.


 tempo 0:22
Vabbè, non vale confrontare un programma DOS con uno Windows. 8-)
Comunque sei sicuro che non c'era il file in cache tra una prova e l'altra?
Ciao
*Roby*

invece ci sta mettendo troppo.
[BT] = border topic (siamo sul filo del rasoio!!)
per chi fosse interessato, ho rifatto il programma utilizzando un db
semplicissnimo (una sola tabella).
risultato: molte meno righe di codice, molti meno problemi, struttura
molto piu' elegante, tempo di ricerca confronto e analisi praticamente
azzerato.
wow!! non credevo che fossero cosi' potenti i db!!
meew che ha scoperto i database.

 sono decisamente improbabili.
Si prospetta uno scontro diretto.
Ciao
*Roby*

 
Ciao

 sono decisamente improbabili.
Eppure quelli sono i tempi che ho ottenuto.

 un file di 40Mb non penso che stia interamente in cache.
Forse dico una stupidaggine, ma il problema potrebbe essere che 48Mb di RAM
sono normalmente pochini:
Programma Pascal sotto DOS:
il SO alloca 1MB e ci fa girare il tuo applicativo. E' vero che deve leggere
il file da disco, ma il tuo programma sta sempre nella stessa area di
memoria (la finestra DOS non può swappare parzialmente) e quindi gira alla
velocità massima.
Programma VB
La Line Input chiama un modulo del VB, che spesso è stato spostato su disco
per liberare RAM da utilizzare per la lettura del file dal disco e per
aggiornane la cache. Questo swapping su disco di parti di codice fa perdere
tempo.
Programma C++
Il C++ sarà anche un bel linguaggio, ma con tutte le sue ereditarietà e i
suoi polimorfismi, chissà in quanti moduli va a piazzare le sue funzionalità
di base (scherzo, eh 8-)), quindi lo swapping su disco ed il necessario
recupero del codice con 48 MB di RAM fa perdere più tempo che in VB.
Se tutto quello che ho detto è vero, su di un sistema con più RAM VB e C++
dovrebbero andare sostanzialmente alla stessa velocità (o forse il C++
dovrebbe andare un po' più veloce, ma qui dipende da come viene gestito il
buffer di lettura da disco di C++ e VB), mentre il programma Pascal in DOS
dovrebbe restare indietro.
Fin qui la teoria. Mandami i 3 eseguibili via mail e ti dico la pratica (ma
se mi mandi dei virus ti svito la testa come un cavatappi 8-))
Ciao
*Roby*
P.S.
I test li hai fatti con programmi compilati o direttamente nell'IDE? Nel
secondo caso la mancanza di RAM dovrebbe essere ancora più sentita.

 I test li hai fatti con programmi compilati o direttamente nell'IDE? Nel
Ho usato programmi compilati.
--
Samuele Battarra
mail server: 
libero.it
account: battarsa