Modifica efficiente dei file di testo [duplicato]

3

Ho lavorato con file di testo abbastanza grandi contenenti circa due milioni di righe di testo. Non conosco la lunghezza del contenuto o delle linee in anticipo, solo il numero di righe. Ho considerato due problemi che probabilmente hanno una soluzione simile:

  • Come faccio a cambiare o aggiungere all'ennesima linea, senza che il mio computer debba spostare tutto dopo l'ennesima riga nella memoria del computer.
  • Dire che voglio eliminare tutte le righe nel file di testo tranne gli ultimi 100k, ogni volta che il numero di righe supera i due milioni. Come faccio a mantenere queste ultime 100k linee, senza dover leggere l'intero file di testo, cancellando tutto e riscrivendo gli ultimi 100k?

Suppongo che possa essere risolto mettendo tutto in qualche sistema di database. Tuttavia, poiché non è un'opzione per me, voglio sapere come lavorare con i file di testo in modo efficiente.

    
posta user4752157 14.10.2015 - 12:55
fonte

2 risposte

4

How do I change or add to the nth line

Non puoi.

Hai linee di lunghezze diverse per cui non puoi sovrascrivere un blocco del file, "sapendolo" per contenere un'intera "linea".

Se i tuoi record erano tutti della stessa lunghezza, probabilmente saresti in grado di utilizzare l'accesso diretto ai file.

How do I keep these last 100k lines, without having to read the entire text file, deleting everything, and rewriting the last 100k?

Non puoi.

Non sai dove inizia e finisce ogni riga, quindi hai per leggerli riga per riga, cominciando dall'inizio. In questo caso, il meglio che puoi fare è creare un nuovo file contenente solo le ultime 100k linee e quindi sovrascrivere il file originale con esso.

Guardando oltre i tuoi problemi immediati, ora ti trovi bene in quel tipo di dimensioni in cui un database semplificherebbe enormemente il tuo codice e migliorerebbe notevolmente le prestazioni dell'applicazione.

    
risposta data 14.10.2015 - 13:08
fonte
0

Carica l'intero file in memoria. È necessario rappresentare tutte le linee come un elenco collegato. Collegamenti di prima linea a 2a linea. Collegamenti di 2a linea a 3rg line ecc. Se elimini la riga 2, devi solo modificare il link nella prima riga dalla riga 2 alla riga 3. Puoi modificare ogni riga senza spostare 100k linee ogni carattere instert ecc.

    
risposta data 14.10.2015 - 13:19
fonte

Leggi altre domande sui tag