Hello,
J'ai plusieurs fichiers de logs (100 x 100Mo), avec une premier colonne contenant le temps en unixtime (avec des centièmes de secondes):
1223305330.56 AAAA
1223305331.45 BBBB
...
J'ai plusieurs fichiers comme cela sur la même période de log. J'aimerais tous mettre dans un seul gros fichier (pour en extraire un joli graphe ensuite)
Problème 1): sort ne supporte pas les nombre a virgule
Problème 2): a mon avis sort n'aime pas trier un fichier de 10Go
De plus, les lignes sont triées par fichier.
Comment feriez vous le merge de manière efficace ? Je pense écrire un programme qui va ouvrir tous les fichiers, lire progressivement chacun et faire un output trie, mais si quelqu'un a une meilleure idée...
Merci a tous.
# Alors, à vue de nez
Posté par Obsidian . Évalué à 2.
Bilan, 200 opérations dont chacune sera plus lente que la précédente en ce qui concerne les 100 dernières (la fusion avec le fichier final), mais maîtrise complète et possibilité de trier/fusionner plus de 2 fichiers à la fois si tu as de la mémoire, pour accélérer les choses.
Pour le point décimal, je ne connais pas de solution miracle mais puisque tu vas automatiser le tout avec un script et comme toutes tes lignes commencent par un timestamp dont le format est connu et constant, tu peux peut-être le faire disparaître avec une expression régulière dans tous tes fichiers, et le remettre à sa place de la même façon dans le fichier final (mais il faut des gigas disponibles).
[^] # Re: Alors, à vue de nez
Posté par Obsidian . Évalué à 3.
Je viens de dire une connerie (le -m servant justement à ça). Une fois tous tes fichiers triés un par un, tu fais un gros sort -m *. Ça fait cent fichiers ouverts mais la progression sera linéaire et ne consomera pas plus de mémoire que nécessaire.
[^] # Re: Alors, à vue de nez
Posté par RB . Évalué à 1.
Comme quoi on passe a cote de certaines options !
La solution complete au probleme:
sort -g -m *
Encore merci :)
[^] # Re: Alors, à vue de nez
Posté par Obsidian . Évalué à 2.
Bon courage.
[^] # Re: Alors, à vue de nez
Posté par RB . Évalué à 1.
[^] # Re: Alors, à vue de nez
Posté par Obsidian . Évalué à 3.
[^] # Re: Alors, à vue de nez
Posté par Sébastien Koechlin . Évalué à 1.
Si tu n'as pas l'espace disque nécessaire dans /tmp, (ou ailleurs), c'est cuit.
J'ai été obligé d'écrire un bout de perl pour faire un merge de N fichiers sans passer par un fichier temporaire.
# sort et les virgules
Posté par left . Évalué à 3.
Et sinon, tu peux me filer un exemple où `sort -n' se plante ? Parce que là j'ai du mal à comprendre.
Pour ce qui est de la taille: à mon avis t'as intérêt à dabord découper tes fichiers par heure (ou moins), puis merger les fichiers des crénaux horaires correspondants, et à la fin les concaténer. Va falloir faire un peu de shell, quoi ;)
[^] # Re: sort et les virgules
Posté par RB . Évalué à 1.
Pour ta solution de spliter, fusionner et reconcatener les fichiers: oui, mais a ce moment la (c'est a dire travailler un petit moment), autant faire une petite appli qui fais le sort de maniere parallele (et je pourrai la reutiliser) (et pas en shell :-).
Bon, tout va bien, sort -m fais exactement ce qu'il faut :)
Merci.
[^] # Re: sort et les virgules
Posté par left . Évalué à 1.
sort -m te fais très bien le truc, maisle split c'est surtout pour répondre à ton point (2) et profiter de tous les coeurs/processeurs de la machine, si tant est qu'il y en ait plusieurs. Au moins je suis sûr que `cat' gère très bien les fichiers de 10Go !
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.