vous voulez construire un index en mémoire du fichier:
- créer une liste vide
open
le fichier
- lecture ligne par ligne (en utilisant
f.readline()
, et stocker dans la liste un tuple composé de la valeur sur laquelle vous voulez trier (extrait avec line.split('\t').strip()
) et le décalage de la ligne dans le fichier (que vous pouvez obtenir en appelant f.tell()
avant d'appeler f.readline()
)
close
le fichier
sort
la liste
Ensuite, pour imprimer le fichier triée, ouvrez à nouveau le fichier et pour chaque élément de votre liste, utilisez f.seek(offset)
pour déplacer le pointeur de fichier au début de la ligne, f.readline()
à lire la ligne et print
la ligne. Optimisation: vous pouvez stocker la longueur de la ligne dans la liste, de sorte que vous pouvez utiliser f.read(length)
dans la phase d'impression.
Exemple de code (optimisé pour une meilleure lisibilité, pas la vitesse):
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)
la commande de tri unix est en effet un outil très puissant. Vous pouvez contrôler le format du champ à trier (numérique, date, etc.) et la quantité de mémoire que le programme peut allouer, en effectuant un tri split + fusion si nécessaire. –
alex pouvez-vous donner un exemple? Le programme de tri à lui seul prend beaucoup de temps ... de l'ordre de 40 minutes. Cela peut avoir quelque chose à voir avec l'allocation de mémoire ou l'E/S du disque. Je ne suis pas sûr de savoir quel est le goulot d'étranglement, mais je suppose que votre suggestion pourrait être utile. – fodon
une erreur dans la solution ci-dessus: pour utiliser uniquement le 2ème champ, il faut -k 2,2 ... donc ce n'est pas zéro indexé (du moins pas sur la version de Kubuntu 11.04 du tri). – fodon