Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Gestire file di testo enormi
Forum - C# / VB.NET - Gestire file di testo enormi

Avatar
willy_80 (Normal User)
Newbie


Messaggi: 5
Iscritto: 06/03/2009

Segnala al moderatore
Postato alle 16:59
Sabato, 21/05/2011
Ciao a tutti,
Sto lavorando su un programma in vb.net che gestisce ed elabora una grande quantità di dati.
I miei dati li ho salvati in un file di testo in questo modo:

dato;dato;dato;dato;dato;dato;dato;dato;dato;...
dato;dato;dato;dato;dato;dato;dato;dato;dato;...
dato;dato;dato;dato;dato;dato;dato;dato;dato;...
[...]

siamo sull'ordine di 20000/30000 dati per riga e 20000/30000 righe.

vorrei accelerare i processi di lettura e scrittura, io quando apro il file uso input, autput o append.
E' possibile aprire e gestire i dati in random per leggere e scrivere nelle righe che mi interessano?

Es.:
1-Diciamo che voglio leggere la riga n°2
2-Splitto i dati e li metto in una matrice
3-Nella seconda cella ci scrivo "ciao"
4-Faccio il Join della matrice
5-Metto la stringa nella riga n°2 sostituendo quella esistente

Al momento usando input e output per fare cio che ho descritto nell'esempio creare un file di appoggio e poi rinominarlo leggendo tutto il file in fase di lettura e di scrittura.

Mi sapete dire come usare la funzione random?

Grazie


Un grande saggio un giorno mi disse: "Non importa quanta esperienza hai il lampo di genio che risolve il problema può arrivare anche da un principiante"
PM
Avatar
R0gerBlack (Member)
Expert


Messaggi: 210
Iscritto: 10/06/2010

Up
3
Down
V
Segnala al moderatore
Postato alle 9:11
Domenica, 22/05/2011
Mmh è vero, potresti dividere il file in più file, ed usare un random per quale file leggere, dopo di ché leggere la riga a caso come ti ho fatto vedere

Quoto. - Il Totem - 22/05/11 12:11
a dire la verità ci ho gia provato a dividere i dati in più files ma il problema è che spesso ho la necessità di rielaborare gruppi di dati e quando mi capita che il gruppo è un po su un file e un po su un altro diventa un casino gestirli, apri di quà chiudi di la ecc... - willy_80 - 23/05/11 13:19


Volere è potere.

Se la conoscenza crea problemi, non è con l'ignoranza che si risolvono [Isaac Asimov]
PM
Avatar
R0gerBlack (Member)
Expert


Messaggi: 210
Iscritto: 10/06/2010

Up
2
Down
V
Segnala al moderatore
Postato alle 22:30
Sabato, 21/05/2011
Che io sappia, devono essere lette prima tutte le righe e messe in un array o in una lista per poi accederci tranquillamente con un Random, quindi se sei disposto a leggere prima tutte le righe, basta che fai

Tra le dichiarazioni

Codice sorgente - presumibilmente VB.NET

  1. Dim RandomText(1024) As String 'Righe Massime
  2. Dim ReadedString As String



Codice sorgente - presumibilmente VB.NET

  1. Dim r As New IO.StreamReader("locazione.txt")
  2.         Dim count As Integer
  3.         While Not r.EndOfStream
  4.             'Leggi la riga successiva finché non finiscono
  5.             RandomText(count) = r.ReadLine
  6.             'RandomText(count) = riga letta
  7.             count += 1
  8.         End While
  9.         'Ridimensiona l'Array (per risparmiare memoria) al massimo
  10.         'numero di frasi ogni riga nel File di testo, es.50 righe =
  11.         'RandomText(49) [RandomText(0) è utilizzato]
  12.         ReDim Preserve RandomText(count - 1)
  13.         'NOTA: Il ReDim effettuato senza Preserve cancellerà tutto
  14.         'il contenuto dell'array
  15.         Dim Rand As New Random
  16.         ReadedString = RandomText(Rand.Next(0, count))
  17.         'ReadedString conterrà la riga letta a caso



RandomText viene dichiarato con indice di 1024 che anche se nella dichiarazione è uno spreco di memoria, dopo la lettura viene ridimensionato con il ReDim Preserve (il ReDim normale cancella tutti i valori dell'Array) al numero delle righe risparmiando così tutta la memoria possibile. Se il tuo file ha più di 1024 righe aumenta l'indice massimo. Così fatto la variabile ReadedString avrà la frase letta a caso

Ultima modifica effettuata da R0gerBlack il 21/05/2011 alle 22:31


Volere è potere.

Se la conoscenza crea problemi, non è con l'ignoranza che si risolvono [Isaac Asimov]
PM
Avatar
XBarboX (Member)
Guru


Messaggi: 945
Iscritto: 31/12/2008

Up
2
Down
V
Segnala al moderatore
Postato alle 19:14
Domenica, 22/05/2011
Secondo me la soluzione migliore è leggere i dati da un database.
Quando ci sono così tanti dati un db è necessario.

Ci ho provato, anche in xml ma con una mole di dati così grande la lettura è comunque lentissima - willy_80 - 23/05/11 13:21
xml non è proprio un buon DB. Prova mysql - XBarboX - 23/05/11 15:52
qualche esempio? - willy_80 - 23/05/11 16:24


The old lie: Dulce et decorum est pro patria mori
PM
Avatar
willy_80 (Normal User)
Newbie


Messaggi: 5
Iscritto: 06/03/2009

Up
0
Down
V
Segnala al moderatore
Postato alle 23:05
Sabato, 21/05/2011
così facendo però dovrei caricare in ram tutta la mole di dati, il che diventerebbe proibitivo e rallenterebbe tutti gli altri processi...


Un grande saggio un giorno mi disse: "Non importa quanta esperienza hai il lampo di genio che risolve il problema può arrivare anche da un principiante"
PM
Avatar
crash outside control (Normal User)
Expert


Messaggi: 217
Iscritto: 12/02/2008

Up
0
Down
V
Segnala al moderatore
Postato alle 23:40
Domenica, 22/05/2011
Testo quotato

vorrei accelerare i processi di lettura e scrittura, io quando apro il file uso input, autput o append.


autput ...

ok hai ragione è output... - willy_80 - 23/05/11 13:17


Anche un orologio fermo segna l'ora giusta due volte al giorno.
Hermann Hesse
PM