Newsgroup: it.comp.lang.visual-basic
Titolo: Confronto tra Files .txt

Il lavoro e' teoricamente molto semplice:
File1.txt
e' un elenco di stringhe una per riga di caratteri alfanumerici.
il file e' di dimensioni notevoli:
circa 15Mb 800.000 linee
una sola striga per ogni linea
lunghezza minima della stringa 1 carattere
lunghezza massimma della stringa 30 caratteri
File2.txt
elenco con le stesse caratteristiche ma di dimensioni molto inferiori
Max 500Kb
cancellare dal File2 le linee che sono presenti anche sul File1.
dopo aver caricato le stringhe del File1 in una matrice mi rimangono
ancora circa 900k di memoria sul pc che dovrebbero consentire di
lavorare abbastanza tranquillamente.
procedendo con il confronto tra i due file i tempi per completare
l'elaborazione sono biblici, da quello che so il confronto tra stringhe
e' molto piu' lungo che tra numeri e stavo pensando ad una qualche
conversione o algoritmo tipo quello usato da winzip delle stringhe in
numeri o codici prima di far partire il confronto,
forse qualcuno ha un'idea gia' sperimentata?
Il vb e' il 6.
Grazie, Roby
-- 
*** Ti piace Piccante? 
www.PeperonciniPerHobby.it
 Facci un Giro! ***

 dopo aver caricato le stringhe del File1 in una matrice 
scusa se mi intrometto con una domanda
ma è proprio necessario caricare l'intero file in memoria ?
non potresti leggere il file1 una riga alla volta e a ogni riga
fare il controllo sul file 2 ?
in questo modo in memoria carichi solo una riga del file 1 e il file2
che è piu piccolo

Carlo Cotica ha scritto nel messaggio...

Dim C As New Collection
Private Sub Form_Load()
    Dim i() As String, a As Long
    Open "file1.txt" For Binary As #1
        i = Split(Input(LOF(1), #1), vbCrLf)
        For a = 0 To UBound(i)
            C.Add i(a), i(a)
        Next a
    Close #1
    Open "file3.txt" For Output As #2
        Open "file2.txt" For Binary As #1
            i = Split(Input(LOF(1), #1), vbCrLf)
            For a = 0 To UBound(i)
                If Controllo(i(a)) Then Print #2, i(a)
            Next a
        Close #1
    Close #2
End Sub
Private Function Controllo(ByVal Key As String) As Boolean
    On Error GoTo Errore
    C.Add Key, Key
    Controllo = True
Errore:
End Function
--
Ciao Fede
By Chicco Production
http://www.webalice.it/bychicco/

 
Se invece di caricare in memoria leggo la linea con Open... i tempi di
elaborazione si allungano ancora di piu'. Le operazioni di I/O sono
molto piu' lente di quelle eseguite nella RAM. Il problema non e' la
memoria ma il fatto di trovare un "trucco" per confrontare velocemente
10.000 linee su 800.000 (8 miliardi di confronti).
Ciao, Roby.


Alice ha scritto:

E' una scheggia! Grazie davvero, ora me lo studio bene perche' mi piace
capire il perche'.
Roby.



Se fai in modo che l'array che contiene il File1 sia ordinato e per la 
ricerca usi un algoritmo ad albero binario, probabilmente guadagni.
Per il confronto usi StrComp?
Bye
Raf 

 l'elaborazione sono biblici,
Bisognerebbe vedere la tua routine di confronto come lavora, se vuoi che 
qualcuno ti dica dove intervenire per migliorare.
In ogni caso Balena suggerisce, per confronti cosi pesanti, di caricare le 
stringhe in vettori di bayte, e poi confrontare quelli, che sono numeri. Io 
non ho mai provato, ma lui sostiene che questa tecnia č mooooooolto piu 
veloce.
-- 
Greg