Qual è l'algoritmo più ottimale per il conteggio delle righe di testo in un file?

6

File > 5 GB, semplicemente con linee come apache access.log.

Devi ottenere il numero di linee.

Qualsiasi costruzione come

file(filename).read().counter('\n')

Leggere tutti i file e sarebbe molto tempo.

per es.

os.stat(filename).st_size

Funziona molto velocemente.

È possibile ottenere almeno ipoteticamente il numero di righe, in base alla dimensione delle prime linee in byte e alla dimensione totale del file.

C'è modo più preciso?

    
posta rezeptor 11.07.2013 - 00:32
fonte

3 risposte

5

wow - Penso che questa sia davvero una domanda davvero interessante! Se capisco la tua domanda, vuoi essere in grado di STIMARE il numero di righe in un file, senza dover iterare attraverso il file. Mi vengono in mente alcune cose:

STIMA basata sulla dimensione del file La stima presuppone sempre un compromesso: un'approssimazione ragionevole con meno lavoro è migliore di un valore assoluto con più lavoro. Mi piace la tua idea di stabilire una dimensione di linea media; di solito i tuoi file seguono lo stesso schema (ad esempio, le coordinate {x, y, z} di alcuni esperimenti), allora sarebbe ragionevole presumere che un file possa essere composto da:

HEADER
{x, y, z}(1),
{x, y, z}(2),
...
{x, y, z}(n)
FOOTER

Se HEADER e FOOTER hanno lo stesso modello in tutti i file, puoi quasi ignorarli come costanti. Il che significa che ti rimane una dimensione del file che dipende dal numero di righe di {x, y, z}. Potresti fare qualche ipotesi (basata sull'osservazione) della dimensione media di queste righe e quindi fare la tua stima da lì. Non c'è motivo per cui questo scenario non possa essere adattato a nessuna situazione in cui il file segua un formato particolare (ovviamente se il file non ha un formato normale allora sarà difficile).

Alternativa: inserisci il numero di linee in HEADER Usando l'abilità di python per iterare su un file, potresti calcolare il numero di linee una volta, e poi puoi interrogare questo valore tutte le volte che vuoi (pensaci come ordinare un array una volta, e poi fare una ricerca binaria su di esso molte volte ). Se hai regolarmente bisogno di sapere quante righe ci sono in un file, questo potrebbe essere un modo ragionevole ed accurato per farlo.

In python, puoi contare il numero di linee senza dover caricare l'intero file in memoria:

number_lines = sum(1 for line in open(my_file))

Anche l'utilizzo di un generatore come questo è ottimizzato in Python, quindi è veloce quanto Python:)

    
risposta data 11.07.2013 - 03:52
fonte
0

scansiona un campione rappresentativo di linee (ad esempio, 100) per la lunghezza della linea media, quindi prendi la lunghezza totale del file e dividila per la media.

se le linee sono molto irregolari, il conteggio delle linee può essere meno utile della dimensione del file come metrica. Se le vite sono molto regolari e complesse, l'analisi in una tabella relazionale può essere utile. (Se è molto regolare e semplice, la lunghezza della linea sarà accurata.)

se questa è una richiesta che ricevi spesso, valuta la possibilità di adattare il file di log in modo da includere un contatore alfanumerico, permettendoti di trovare e analizzare solo i valori dell'ultima e della prima riga.

Se si tratta di una singola operazione ad-hoc, basta contare \ n.

se possibile, ridurre le dimensioni del file di registro.

    
risposta data 11.07.2013 - 03:47
fonte
0

Per fare una stima, il tuo campione dovrebbe essere randomizzato. Non limitarti a guardare le prime 100 righe. Abbiamo accesso casuale a questi file. Usalo. Quelle prime linee potrebbero essere radicalmente diverse dal resto. Va bene immergersi in un punto casuale, cercare un terminatore di riga, contare fino a quando non si arriva a quello successivo, ripetere.

Non preoccuparti di escludere le righe che sono state contate prima. Non fa molto male alla matematica e ti rallenterebbe.

Alcuni punti minori:

Oltre alle dimensioni del file è necessario conoscere la lunghezza media della linea (numero di caratteri) e i byte medi per carattere. Oppure puoi essere sicuro di contare davvero i byte quando ottieni la media per riga. Il mondo non funziona più su ASCII più.

Inoltre, i terminatori di riga possono essere 8 o 16 bit, che verranno visualizzati nelle dimensioni del file. Scopri con chi hai a che fare quando li conti.

    
risposta data 10.05.2016 - 12:17
fonte

Leggi altre domande sui tag