0
votes

Comment trouver le plus grand nombre dans un très grand fichier texte (~ 150 Go)?

J'ai un fichier texte qui possède environ 100000000 lignes, chacun des types suivants: xxx

Je souhaite trouver le plus grand nombre présent dans ce fichier.

Mon code actuel lit chaque ligne, le scindre par espace et stocke le plus grand nombre de la ligne en cours. Ensuite, je le comparifie avec le plus grand nombre de la ligne suivante et conserve le plus grand des deux. xxx

mais cela prend pour toujours. Y a-t-il un meilleur moyen de faire cela?

Je suis ouvert aux solutions avec AWK ou d'autres commandes shell.

EDIT: Ajout de la façon dont je lis le fichier.


7 commentaires

Comment obtenez-vous all_lines ?


Que voulez-vous dire en lisant normalement? Veuillez poster un exemple minimal montrant ce que vous faites réellement avec le fichier.


Vous n'avez pas répondu à ma question. Qu'est-ce que all_lines spécifiquement? S'il vous plaît poster tout de votre code.


blog.pythonlibrary.org/2014 / 01/27 / ...


Comment est votre sous-système d'E / S? Si vous pouvez avoir des threads ou des processus différents de lire un sous-ensemble différent du fichier simultanément, cela est susceptible d'aider beaucoup; Aucun point à quitter CPU ou I / O bande passante gaspillée.


Fondamentalement - prenez la taille de votre dossier en octets, de la réduire de moitié, cherchez-la à ce point, trouvez l'emplacement de la nouvelle ligne suivante, faites que votre point divisé, donc un fil trouve le maximum de tout avant et un fil de fil trouve le max. de tout après. Répétez la répétition jusqu'à ce que vous obteniez la charge de travail dans un nombre suffisant de subdivisions.


Comme vous avez un grand nombre de chiffres sur chaque ligne, il existe une bonne quantité de travail à faire par ligne. Il peut donc être utile d'utiliser un certain parallélisme / filetage lorsque Charles Duffy suggère, car il peut ne pas être I / O lié. Je vous suggère de regarder GNU parallèle Spécifiquement avec l'option - pipepart pour calculer le fichier dans autant de morceaux que vous avez des cœurs CPU et les traiter en parallèle. Si vous fournissez un code qui génère des données représentatives avec le nombre de lignes et d'échantillons appropriés par ligne, je peux (ou non) expérimenter pour vous.


3 Réponses :


4
votes

C'est une tâche triviale pour Awk. XXX

S'il est garanti que votre fichier n'est pas tous des zéros ou des numéros négatifs, vous pouvez supprimer nr == 1 {m = $ 2} partie.


0 commentaires

1
votes

Essayez cette solution PERL

$ cat sample1.txt
string 1 2 4 10 7
string 1 2 44 10 7
string 3 2 4 10 70
string 9 2 44 10 7
$ perl -lane ' $m=(sort {$b<=>$a} @F[1..$#F])[0]; $max=$m>$max?$m:$max ; END { print $max } ' sample1.txt
70
$


4 commentaires

Peut utiliser max de core Liste :: util au lieu de Trier , pour efficacité: perl -mlist :: util = max -lane '$ m = max @f; ....


@ zdim..vous avez raison .. :-) Mon bureau Rhel Perl est une erreur d'erreur pour l'installation de modules CPAN .. donc je vais devoir vivre avec des modules de base :-(


Oh pardon. Pouvez-vous mettre à niveau? Le V5.10.1 est bien mais vraiment vieux à ce stade. Ou, courir avec Perlbrew?


Ouais..it est vieux .. Si je suis administrateur, je peux le faire .. Cela prendra beaucoup de temps .. Btw Si vous avez le temps, pouvez-vous essayer des questions / 53706983



0
votes

Je voulais écrire un script AWK sans pour en boucle les colonnes pour comparer les temps d'exécution avec un pour Solution en boucle telle que @ oguzismail trivial . J'ai créé un million d'enregistrements de 1-100 colonnes de données, des valeurs comprises entre 0 et 2 ^ 32. J'ai joué avec RS pour comparer uniquement les colonnes 2-100, mais comme étant requise Regex, il a ralenti l'exécution. Beaucoup. Utilisation d'un tr pour échanger de l'espace et de nouvelles lignes, je suis assez proche: xxx

sortie de CAT <(ECHO 0) Fichier | TR '\ N' '\ N' : xxx

la solution utilisé: xxx < / pré>

alors que mon tr + awk a été dépensé: xxx

(surprenant, si je prépressions d'abord les données avec le tr dans un fichier, puis lisez-le avec AWK, il ne serait pas plus rapide, la plupart du temps plus lentement)

Alors, j'ai décidé de tester mes compétences de rouille C pour définir une sorte de la ligne de base (les pages de l'homme sont plutôt bonnes. Et Google.): xxx

résultat de celui-ci: xxx

oh, Utiliser Mawk au lieu de Gawk a presque réduit de moitié les résultats.


1 commentaires

Pas un expert sur C mais je plaisante avec MMAP. Voir: coller.ubuntu.com/p/8Q2SPJGTX5