mslider
Messages postés109Date d'inscriptionjeudi 21 octobre 2004StatutMembreDernière intervention 7 mars 2010
-
25 janv. 2010 à 12:30
tpoinsot
Messages postés345Date d'inscriptionmardi 1 juin 2004StatutMembreDernière intervention17 octobre 2014
-
25 févr. 2010 à 16:23
--Bonjour à tous et toutes,
j'ai un problème à résoudre en C ou C++, je l'ai en partie résolu pour une petite quantité de
données, mais çà plante dès que la taille du fichier augmente.
Il s'agit de construire des tableaux croisés (ou table pivot)
Voilà un exemple:
contenu du fichier texte à traiter (ce n'est qu'un echantillon):
je travaille sur une machine 64 bits, donc écrire du code 64 bits serait une optimisation.
Si quelqu'un a déjà eu ce genre de problème à traiter, un petit coup de pouce serait le bienvenu, merci.
tpoinsot
Messages postés345Date d'inscriptionmardi 1 juin 2004StatutMembreDernière intervention17 octobre 20144 23 févr. 2010 à 10:23
On pourrait améliorer la lecture et le traitement mais au vu de tes résultats c'est inutile face au temps d'écriture.
Combien mets-tu de temps pour copier le fichier en entrée ? (avec cp, tout simplement)
Tu trie ce fichier en 2 mn : le fichier est-il bien trié à l'arrivée ? (quelques pages avec more pour voir, puis un tail)
J'ai un rapport de 1 à 15 entre les 2 premières phases et la troisième. Toi tu as 30s, avec ce ratio x 15 7.5 mn, + les 30s du début 8mn : c'est pourquoi je m'attendais à 10mn.
Avec /dev/null, mon ratio est de 4.5 : le tien est un poil plus bas mais ça se tient.
La Question est donc "Pourquoi l'écriture est-elle si longue ?"
Au fait, quelle est la taille du fichier résultant ?
Contrairement à un tri (taille après = taille avant), ce programme crée un fichier différent de l'entrée, et a priori plus grand.
mslider
Messages postés109Date d'inscriptionjeudi 21 octobre 2004StatutMembreDernière intervention 7 mars 2010 23 févr. 2010 à 10:37
j'ai vérifié le fichier est bien trié.
temps pour copier le bigfile.txt: time cp bigfile.txt bigfile.dat
0.001u 6.316s 1:09.12 9.1% 0+0k 0+0io 0pf+0w
c'est normal que le fichier résultant est plus gros vu que le programme construit une matrice
en rajoutant un nombre considérable de 0 et de retour à la ligne,un exemple avec le fichier sample.dat de 10000 lignes:
./last -v sample.dat out.txt
232551 Feb 4 21:06 sample.dat
1086525 Feb 23 10:36 out.tx
tpoinsot
Messages postés345Date d'inscriptionmardi 1 juin 2004StatutMembreDernière intervention17 octobre 20144 23 févr. 2010 à 15:28
Surtout n'oublie pas de trier suivant la colonne "tag" avant de lancer ce traitement.
Entre la version page 7 et la dernière, il y a une amélioration sur le sample.txt (sur mon ordi) mais pas sur le bigfile (sur ton ordi).
Ca dépend du nombre de cases remplies dans la matrice finale. Plus il y en a, et plus ça va vite relativement à la taille du fichier initial.
mslider
Messages postés109Date d'inscriptionjeudi 21 octobre 2004StatutMembreDernière intervention 7 mars 2010 23 févr. 2010 à 15:35
toutes façon toutes les parties du code ont été optimisées,
la partie du code qui occupe la majeure partie du traitement c'est l'écriture et encore que tu as utilisé open qui est une instruction de plus bas niveau que fopen.
Ya pas une instruction sysopen() qui est encore de plus bas niveau en C ?
tpoinsot
Messages postés345Date d'inscriptionmardi 1 juin 2004StatutMembreDernière intervention17 octobre 20144 23 févr. 2010 à 15:56
ben non. Si mon souvenir est bon, le code de read() est en assembleur. Mais ça dépend peut-être des implémentations.
Il y a encore moyen d'améliorer les 2 premières parties, mais le jeu n'en vaut plus la chandelle. Il s'agit d'agir sur 1/70e du temps total ! bof. Au mieux, on va gagner 5 secondes.
Sur mon ordi, il est plus rapide de ne pas mettre de 2nd parametre et de rediriger la sortie standard dans un fichier. Là j'ai un message d'erreur (il faut initialiser fdo à 1 au lieu de -1, et ce sera bon).
Et finalement, sans l'option -v, on gagne encore quelques secondes !
mslider
Messages postés109Date d'inscriptionjeudi 21 octobre 2004StatutMembreDernière intervention 7 mars 2010 24 févr. 2010 à 15:05
je viens de compiler le code sur une machine 32 bits qui a 6Go de RAM
tout se passe bien, çà tourne bien sur le fichier sample.dat (10000 lignes)
par contre pour un fichier plus gros d'un million de lignes:
tpoinsot
Messages postés345Date d'inscriptionmardi 1 juin 2004StatutMembreDernière intervention17 octobre 20144 24 févr. 2010 à 16:42
2 remarques sur ton memcpy :
- int minor = bytes % 4;
modulo, pas terrible avec une puissance de 2, quand on fait ensuite du décalage de bits.
Je verrai plutôt
int minor = bytes & 0x03;
ok, c'est puriste
- cela sous-entend que sizeof(int) = 4. Quand c'est 8, danger !