Si, pour une raison étrange, je me retrouve avec un 100 GO de fichier journal qui est non triés (en fait c'est partiellement trié), tandis que les algorithmes que j'essaie d'appliquer nécessitent des données triées. Une ligne dans le fichier journal ressemble
data <date> data data more data
J'ai accès à C# 4.0 et de 4 GO de RAM sur mon poste de travail. J'imagine que l'opération de fusion-tri de certains type serait le mieux, mais à court de mise en œuvre de ces algorithmes de moi - même- je veux vous demander si il y a une sorte de raccourci que j'ai pu prendre.
D'ailleurs l'analyse de la chaîne de date avec DateTime.Parse()
est très lent et prend beaucoup de temps PROCESSEUR - Le calage detaux est seulement de 10 MO/sec. Est-il un moyen plus rapide que le suivant?
public static DateTime Parse(string data)
{
int year, month, day;
int.TryParse(data.Substring(0, 4), out year);
int.TryParse(data.Substring(5, 2), out month);
int.TryParse(data.Substring(8, 2), out day);
return new DateTime(year, month, day);
}
J'ai écrit que pour accélérer DateTime.Parse()
et cela fonctionne bien, mais il est encore de prendre un seau en charge de cycles.
Notez que le fichier de journal, je suis intéressé en heures, minutes et secondes. Je sais que je peux fournir DateTime.Parse() avec le format, mais qui ne semble pas accélérer beaucoup.
Je suis à la recherche d'un coup de pouce dans la bonne direction, grâce à l'avance.
EDIT: Certaines personnes ont suggéré que j'utilise de comparaison de chaîne afin de comparer des dates. Qui serait à l'œuvre pour la phase de tri sélectif, mais j'ai besoin d'analyser des dates pour les algorithmes. Je n'ai toujours aucune idée de la façon de trier les 100 GO de fichiers sur 4 go de ram libre, sans le faire manuellement.
EDIT 2 : et Bien, grâce à plusieurs suggestions que j'utilise windows tri, j'ai découvert qu'il existe un outil similaire pour Linux. Fondamentalement, vous appeler trier et elle corrige tout pour vous. Pendant que nous parlons, c'est de faire quelque chose, et j'espère que ça va finir bientôt. La commande que j'utilise est
sort -k 2b 2008.log > 2008.sorted.log
-k indique que je veux sur la deuxième ligne, qui est une date-time de la chaîne dans l'habituel YYYY-MM-DD hh:mm:ss.msek
format. Je dois avouer que le man-pages sont dépourvues d'expliquer toutes les options, mais j'ai trouvé beaucoup d'exemples en exécutant info coreutils 'sort invocation'
.
Je vais faire rapport des résultats et de délais. Cette partie du journal est d'environ 27GB. Je pense tri 2009 et 2010 séparément puis de les fusionner les résultats dans un fichier unique avec le tri -m option.
Edit 3 Ainsi, la vérification de iotop suggère que c'est la lecture en petits morceaux du fichier de données, puis furieusement de faire quelque chose afin de les traiter. Ce processus semble être assez lente. =(
sort
n'est pas à l'aide de la mémoire, et d'un seul cœur. Quand il n'lire les données à partir du disque, ce n'est pas de traitement du tout. Suis-je en train de faire quelque chose de mal?
Edit 4 Trois heures, et il est encore en train de faire la même chose. Maintenant j'en suis au stade où je veux essayer de jouer avec les paramètres de la fonction, mais je suis de trois heures investies... je vais abandonner en environ 4 heures, et essayer de le mettre pour la nuit le calcul avec plus intelligente de la mémoire et de l'espace des paramètres...
Edit 5 Avant que je rentre à la maison, j'ai redémarré le processus avec la commande suivante:
sort -k 2b --buffer-size=60% -T ~/temp/ -T "/media/My Passport" 2010.log -o 2010.sorted.log
Il est revenu ce, ce matin:
sort: write failed: /media/My Passport/sortQAUKdT: File too large
Wraawr! J'ai pensé que je voudrais simplement ajouter que beaucoup de lecteurs de disque dur que possible pour accélérer le processus. Apparemment, l'ajout d'un lecteur USB était la pire idée jamais. Pour le moment, je ne peux même pas dire si c'est à propos de FAT/NTFS ou quelque chose comme ça, parce que fdisk me dit que la clé USB est un "mauvais périphérique"... sans blague. Je vais essayer de donner un autre aller plus tard, pour l'instant, nous allons mettre ce projet dans le peut-être l'échec de la pile.
Avis Final Cette fois, il a travaillé, avec la même commande que précédemment, mais sans la problématique disque dur externe. Merci à vous tous pour votre aide!
L'analyse comparative
À l'aide de 2 poste de travail de qualité (au moins 70 mo/sec en lecture/écriture IO) disques durs sur le même contrôleur SATA, il m'a fallu 162 minutes pour trier un 30GO fichier journal. J'ai besoin de trier un autre 52 GO de fichier ce soir, je vais poster comment ça se passe.