Newsgroup: it.comp.lang.visual-basic
Titolo: Lettura FIle testo da 3 Giga

Sapete qual'e' il metodo migliore per la lettura di un file 
di testo sui 3-4 Giga per la ricerca e visualizzazione di alcuni record?
con line input ho problemi gia' con dimensioni di 10 Mega.
come da MSDN:
Dim TextLine
Open "FILEPROV" For Input As #1   ' Apre il file.
Do While Not EOF(1)   ' Ripete fino alla fine del file.
   Line Input #1, TextLine   ' Assegna la riga a una variabile.
  ' Debug.Print TextLine   ' Scrive nella finestra Immediata.
Loop
Close #1   ' Chiude il file.
Grazie.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

  con line input ho problemi gia' con dimensioni di 10 Mega.
Scusa la curiosità: che problemi ti dà?
Il line input legge una riga alla volta, e poi la butta via, non è che ti carica
i tre giga in memoria...
Questo, di suo, se poi tu la riga letta la memorizzi da qualche parte il
discorso cambia...
--
Salutoni
Sergio

CSSoft wrote:



semplice ... come per l'esempio che ti ho descritto presente su msdn:
Dim TextLine
Open "FILEPROV" For Input As #1 ' Apre il file.
Do While Not EOF(1) ' Ripete fino alla fine del file.
Line Input #1, TextLine ' Assegna la riga a una variabile.
' Debug.Print TextLine ' Scrive nella finestra Immediata.
Loop
Close #1 ' Chiude il file.
-- 


 semplice ... come per l'esempio che ti ho descritto presente su msdn:
Fly, sembrerà strano, ma qualche volta ho utilizzato anch'io l'istruzione Line
Input, e quindi non ho bisogno che tu mi riporti l'esempio di MSDN, anche perchè
è una ciofeca, non facendo uso della funzione freefile.
Quello che mi incuriosiva era il presunto limite di dimensione dei file:
personalmente l'ho usato su file grandi qualche decina di mega e non mi ha mai
posto alcun problema, volevo sapere qual era la tua difficoltà.
--
Salutoni
Sergio

 posto alcun problema, volevo sapere qual era la tua difficoltà.
la difficolta' e' che si blocca tutto con messaggio fine memoria :-(
puo' darsi che debba, in aggiunta al codice che ti ho postato, aggiungere
la funz di cui mi hai parlato (freefile)
bye 


 bye
perdona l'insistenza: dici che il ciclo da te postato, così com'è, dà errore di
memoria esaurita se il file da leggere è molto grande?
Domanda forse stupida: nel file di testo che devi leggere ci sono i ritorni a
capo?
--
Salutoni
Sergio

 capo?
Certe volte pernso che la gente di questo NG sia grande :)
Sei un grandeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee!
Mi sento di concordare con CCSoft ,
se ci sono ritorni a capo , quanto è lungo il testo fino ad goni a capo?
IL file usa una formattazione particolare a va alla caxxo di cane?
cioè le linee di testo hanno tutte la stessa lunghezza ?
ciao
Lorenzo

 cioè le linee di testo hanno tutte la stessa lunghezza ?
il ritorno a capo c'e', anche se sono molto lunghe e a lunghezza variabile
da quello che dite il problema dovrebbe essere l'eccessiva lunghezza delle
righe ...ci dovrebbe essere un modo per spezzarle...


 da quello che dite il problema dovrebbe essere l'eccessiva lunghezza delle
Si ma per eccessiva lunghezza , intendiamo ECCESSIVA
cioe righe di milioni di caratteri ,
altrimenti non e possibile
ciao
Lorenzo

 lunghezza delle righe ...ci dovrebbe essere un modo per spezzarle...
La lunghezza variabile delle righe non dovrebbe essere un problema.
Righe molto lunghe che cosa vuol dire?
Fino a quanti caratteri ci possono essere?
Adesso non ricordo con precisione, ma mi era capitato di lavorare con stringhe
lunghe qualche k e non avevo trovato problemi.
Comunque, se vuoi caricare il file a pezzetti più piccoli di una riga, temo tu
debba aprirlo in modalità binaria, ma se l'unità informativa è comunque
costituita da una riga la devi ricostruire in seguito, e sei al campo delle
sette pertiche....
--
Salutoni
Sergio

 Comunque, se vuoi caricare il file a pezzetti più piccoli di una riga, 
Se invece di line input leggessi un numero di byte alla volta  ,le
prestazioni peggiorerebbero di molto? 
arithanks


 arithanks
beh... direi che la differenza di prestazione tra una cosa che non funziona e
una che funziona, sia sempre a vantaggio della prima :-)
Comunque non ne ho la minima idea: prova e facci sapere.
--
Salutoni
Sergio

 prestazioni peggiorerebbero di molto?
Assolutamente no dipende ovviamente dalla grendezza del buffer,
la distinzione tra file di testo e binari e solo una convenzione
la funzione line input legge byte a byte allocando la memoria dinamicamente
dino al primo CR e ti riporta la stringa trattando i byte come caratteri
ASCII.
è fatta solo per comodita in vb come negli altri linguaggi.
Trova la dimensione del buffer per la lettura a te piu consona ed usala.
L'equazione è sempre la stessa
+Memoria = +Veloce = +Dati
-Memoria=-Veloce=-dati
ciao
Lorenzo

 prestazioni peggiorerebbero di molto?
Fly, cos'altro c'è fra le istruzioni che hai postato?
Così, giusto per sapere, perchè quel codice non può creare problemi,
qualunque sia la dimensione del file e sempre che ogni tanto ci sia qualche
CR+LF, ovvero che non vi sia una riga da 3Gb...
Sicuro che sia una file di testo?

 di testo sui 3-4 Giga per la ricerca e visualizzazione di alcuni record?
se sono record a lubghezza fissa puoi aprirli in binario ( open... for
binary...)
e poi utlizzare il seek mi pare per spostarti all'interno di esso !!!
(ti rimando alle info sempre su msdn)

 Sicuro che sia una file di testo?
Avevo fatto un prova con un file di 5 MB aperto con wordpad 
e li per li avevo visto varie righe, quindi credevo ci fossero ritorni a
capo e invece mi sa che wordpad visualizza una riga su piu' righe :-)
ps. la prossima volta il file lo apro con un editor esadecimale ;-)))


 capo e invece mi sa che wordpad visualizza una riga su piu' righe :-)
Avrai attivato il "A capo automatico"...

 Fly ha scritto:


No non  c'entra, ho controllato, disattivato l'a capo automatico
e gli a capo ci sono lo stesso il discorso e' che ho cercato su  msdn 
e ho trovato che:
L'errore potrebbe essere causato daespressioni che vengono valutate
utilizzando stringhe temporanee. In alcuni sistemi operativi, il codice
riportato di seguito, ad esempio, genera l'errore Spazio stringa esaurito:
MyString = "Salve"
For Count = 1 To 100
MyString = MyString & MyString
Next Count
quindi secondo me non ce la fa a leggere una stringa particolarmente lunga


 quindi secondo me non ce la fa a leggere una stringa particolarmente lunga
Il problema è sempre lo stesso, scusate se mi ripeto:
le variabili vengono allocate dinamicamente,
ed ad ogni concatenazione di stringa vb fa una copia della stringa sorgente
e destinazione e le concatena in una nuova.
Se invece lo dichiari
Dim strtmp as string *500 (5 lettere di "salve" *100)
e la riempi con quel ciclo for
dimensionandola tu dall'inizio , vb non si prende più in carico la rottura e
non rischi l'errore IMHO
Deriva tutto da come VB alloca la memoria per le stringhe DINAMICHE
ciao
Lorenzo

Quindi ti consiglio
di aprire il file in modalità testo ed usare stringhe
di lunghezza fissa
dim strFF as string*1000
e leggi con input e non con line input
LinesFromFile = Input(n, FileNum)
ciao
Lorenzo

 non rischi l'errore IMHO
count1 - "salvesalve"
count2 - "salvesalvesalvesalve"
count3 - "salvesalvesalvesalvesalvesalvesalvesalve"
40 b al terzo giro...
ciao

 con line input ho problemi gia' con dimensioni di 10 Mega.
Oltre ai consigli degli altri (č sempre meglio usare l'apertura
binaria, che č piů generica) ricordati che se eccedi la dimensione di
due GigaByte gli operatori PUT e GET (o altri nativi di VB) non
funzionano in quanto utilizzano variabili Long per tenere indice della
posizione del file.
Il range teorico del Long in VB č infatti [-2^31 , +2^31-1], ma
siccome i puntatori alla posizione del file non possono avere indice
negativo si possono utilizzare i valori da 0 a 2^31-1 per un totale di
2Gb tondi tondi.
In pratica se la tua funzione deve gestire file piů grossi di 2Gb ti
consiglio di verificare se esistono API che facciano input e output
senza questa limitazione
Ciao,
termoPilucco

 ciao
Scusate la superfattanza nel calcolo, sbonk ! :(
cmq la sostanza resta, basta solo dimensionare correttamente :)
chi mi fa il calcolo?
gheghegheghe
ciao
Lorenzo