si vuole costruire un indice in memoria per il file:
- creare una lista vuota
open
il file
- leggerlo riga per riga (utilizzando
f.readline()
, e conservare in lista una tupla costituita dal valore su cui si desidera ordinare (estratto con line.split('\t').strip()
) e l'offset della riga nel file (che è possibile ottenere chiamando f.tell()
prima di chiamare f.readline()
)
close
il file
sort
lista
Poi per stampare il file ordinato, riaprire il file e per ogni elemento della vostra lista, utilizzare f.seek(offset)
per spostare il puntatore del file all'inizio della riga, f.readline()
a leggere la linea e print
la linea.
Ottimizzazione: è possibile memorizzare la lunghezza della linea nell'elenco, in modo da poter utilizzare f.read(length)
nella fase di stampa.
codice di esempio (ottimizzato per leggibilità, non di velocità):
def build_index(filename, sort_col):
index = []
f = open(filename)
while True:
offset = f.tell()
line = f.readline()
if not line:
break
length = len(line)
col = line.split('\t')[sort_col].strip()
index.append((col, offset, length))
f.close()
index.sort()
return index
def print_sorted(filename, col_sort):
index = build_index(filename, col_sort)
f = open(filename)
for col, offset, length in index:
f.seek(offset)
print f.read(length).rstrip('\n')
if __name__ == '__main__':
filename = 'somefile.txt'
sort_col = 2
print_sorted(filename, sort_col)
fonte
2011-08-16 14:23:44
il comando unix sort è davvero uno strumento molto potente. È possibile controllare il formato del campo per ordinare (numerico, data, ecc.) E la quantità di memoria che il programma può allocare, eseguendo un ordinamento split + merge se necessario. –
alex puoi fare un esempio? Il programma di ordinamento da solo richiede molto tempo ... dell'ordine di 40 minuti. Questo potrebbe avere qualcosa a che fare con l'allocazione di memoria o l'I/O del disco. Non sono sicuro di capire quale sia il collo di bottiglia, ma suppongo che il tuo suggerimento possa essere utile. – fodon
un errore nella soluzione sopra: per usare solo il 2 ° campo, uno ha bisogno di -k 2,2 ... quindi non è indicizzato a zero (almeno non sulla versione di ordinamento di Kubuntu 11.04). – fodon