J'ai un fichier texte qui possède environ 100000000 lignes, chacun des types suivants: Je souhaite trouver le plus grand nombre présent dans ce fichier. P> 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. P> mais cela prend pour toujours. Y a-t-il un meilleur moyen de faire cela? P> Je suis ouvert aux solutions avec AWK ou d'autres commandes shell. P> EDIT: Ajout de la façon dont je lis le fichier. P > p>
3 Réponses :
C'est une tâche triviale pour Awk. 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} code> partie. p> p>
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 $
Peut utiliser max code> de core Liste :: util au lieu de
Trier code>, pour efficacité:
perl -mlist :: util = max -lane '$ m = max @f; .... code>
@ 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
Je voulais écrire un script AWK sans sortie de la solution em> em> utilisé: p> alors que mon (surprenant, si je prépressions d'abord les données avec le 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.): p> résultat de celui-ci: p> oh, Utiliser Mawk au lieu de Gawk a presque réduit de moitié les résultats. P> p> pour code> en boucle les colonnes pour comparer les temps d'exécution avec un
pour code> Solution en boucle telle que @ oguzismail trivial em> . 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 code> pour comparer uniquement les colonnes 2-100, mais comme étant requise Regex, il a ralenti l'exécution. Beaucoup. Utilisation d'un
tr code> pour échanger de l'espace et de nouvelles lignes, je suis assez proche:
CAT <(ECHO 0) Fichier | TR '\ N' '\ N' code>: p>
tr code> + awk a été dépensé: p>
tr code> dans un fichier, puis lisez-le avec AWK, il ne serait pas plus rapide, la plupart du temps plus lentement) p>
Pas un expert sur C mais je plaisante avec MMAP. Voir: coller.ubuntu.com/p/8Q2SPJGTX5
Comment obtenez-vous
all_lines code>?
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 code> spécifiquement? S'il vous plaît poster tout i> 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 i> 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 B> Spécifiquement avec l'option
- pipepart code> 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.