42 votes

Mélange aléatoire de lignes de 3 millions de lignes

Tout est dans le titre. Je me demande si quelqu'un sait qu'une mémoire rapide et raisonnable exige un moyen de mélanger au hasard toutes les lignes d'un fichier de 3 millions de lignes. Je suppose que ce n'est pas possible avec une simple commande vim, donc n'importe quel script simple utilisant Python. J'ai essayé avec du python en utilisant un générateur de nombres aléatoires, mais n'ai pas réussi à trouver une issue simple.

62voto

John Kugelman Points 108754

Ne prend que quelques secondes en Python :

import random
lines = open('3mil.txt').readlines()
random.shuffle(lines)
open('3mil.txt', 'w').writelines(lines)

38voto

S.Lott Points 207588
import random
with open('the_file','r') as source:
    data = [ (random.random(), line) for line in source ]
data.sort()
with open('another_file','w') as target:
    for _, line in data:
        target.write( line )

Cela devrait le faire. 3 millions de lignes s'intégreront dans la mémoire de la plupart des machines à moins que les lignes ne soient ÉNORMES (plus de 512 caractères).

30voto

Drag0 Points 466

J'ai juste essayé ceci sur un fichier avec 4.3M de lignes et la chose la plus rapide était la commande 'shuf' sur Linux. Utilisez-le comme ceci :

shuf huge_file.txt -o shuffled_lines_huge_file.txt

Il a fallu 2-3 secondes pour terminer.

3voto

fuzzyTew Points 748

Sur de nombreux systèmes, la commande shell sort -R pour randomiser son entrée.

2voto

S.Lott Points 207588

Voici une autre version

Au niveau de la coquille, utilisez ceci.

python decorate.py | sort | python undecorate.py

decorate.py

import sys
import random
for line in sys.stdin:
    sys.stdout.write( "{0}|{1}".format( random.random(), line ) )

undecorate.py

import sys
for line in sys.stdin:
    _, _, data= line.partition("|")
    sys.stdout.write( line )

Il n'

utilise presque pas de mémoire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X