J'ai un fichier de 500 Mo et qui contient environ 50 millions
de mots. Le format est le suivant:
12345 mot
(ou)
mot 12345
Je voudrais trier une telle base de données le plus rapidement
possible. Pour le moment, j'ai un utilitaire en DOS qui trie
un gros fichier en blocs de 80 000 lignes, mais je trouve que
c'est long puisque chaque itération demanderait quelque chose
comme 1000 tris. Vu l'usage en vue, je pourrais réduire le
nombre de mots à chaque itération, alors le total serait loin
de 1000 x 1000, mais c'est tout de même un peu trop long.
Je regarde donc du côté de Linux pour voir s'il y a des outils
qui permettent déjà de faire un tel tri sans avoir à écrire le
code requis.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Jérémy JUST
On Mon, 21 Nov 2005 18:48:52 -0500 Denis Beauregard wrote:
J'ai un fichier de 500 Mo et qui contient environ 50 millions de mots. Le format est le suivant:
12345 mot (ou) mot 12345
Je voudrais trier une telle base de données le plus rapidement possible.
Comment veux-tu la trier? Par simple ordre alphabétique? Par ordre alphabétique sur le mot de chaque ligne? Par ordre numérique sur le nombre de chaque ligne?
Pour le moment, j'ai un utilitaire en DOS qui trie un gros fichier en blocs de 80 000 lignes, mais je trouve que c'est long puisque chaque itération demanderait quelque chose comme 1000 tris.
Avec la commande « sort », tu pourras trier par ordre alphabétique ou numérique, considéré sur le ligne, ou seulement certaines colonnes. Cette commande se débrouille (il me semble) pour écrire des fichiers temporaires, pour ne pas trop charger la mémoire.
Si ce n'est pas ce que tu veux, expliques un peu plus en détails, et on pourras peut-être t'aider. Le mieux serait que tu donnes une vingtaine de lignes d'exemple à trier (indique aussi la quantité de mémoire que tu peux allouer au tri, c'est important).
-- Jérémy JUST
On Mon, 21 Nov 2005 18:48:52 -0500
Denis Beauregard <no@nospam.com.invalid> wrote:
J'ai un fichier de 500 Mo et qui contient environ 50 millions
de mots. Le format est le suivant:
12345 mot
(ou)
mot 12345
Je voudrais trier une telle base de données le plus rapidement
possible.
Comment veux-tu la trier? Par simple ordre alphabétique? Par ordre
alphabétique sur le mot de chaque ligne? Par ordre numérique sur le
nombre de chaque ligne?
Pour le moment, j'ai un utilitaire en DOS qui trie un gros fichier en
blocs de 80 000 lignes, mais je trouve que c'est long puisque chaque
itération demanderait quelque chose comme 1000 tris.
Avec la commande « sort », tu pourras trier par ordre alphabétique ou
numérique, considéré sur le ligne, ou seulement certaines colonnes.
Cette commande se débrouille (il me semble) pour écrire des fichiers
temporaires, pour ne pas trop charger la mémoire.
Si ce n'est pas ce que tu veux, expliques un peu plus en détails, et
on pourras peut-être t'aider.
Le mieux serait que tu donnes une vingtaine de lignes d'exemple à
trier (indique aussi la quantité de mémoire que tu peux allouer au
tri, c'est important).
On Mon, 21 Nov 2005 18:48:52 -0500 Denis Beauregard wrote:
J'ai un fichier de 500 Mo et qui contient environ 50 millions de mots. Le format est le suivant:
12345 mot (ou) mot 12345
Je voudrais trier une telle base de données le plus rapidement possible.
Comment veux-tu la trier? Par simple ordre alphabétique? Par ordre alphabétique sur le mot de chaque ligne? Par ordre numérique sur le nombre de chaque ligne?
Pour le moment, j'ai un utilitaire en DOS qui trie un gros fichier en blocs de 80 000 lignes, mais je trouve que c'est long puisque chaque itération demanderait quelque chose comme 1000 tris.
Avec la commande « sort », tu pourras trier par ordre alphabétique ou numérique, considéré sur le ligne, ou seulement certaines colonnes. Cette commande se débrouille (il me semble) pour écrire des fichiers temporaires, pour ne pas trop charger la mémoire.
Si ce n'est pas ce que tu veux, expliques un peu plus en détails, et on pourras peut-être t'aider. Le mieux serait que tu donnes une vingtaine de lignes d'exemple à trier (indique aussi la quantité de mémoire que tu peux allouer au tri, c'est important).
-- Jérémy JUST
Denis Beauregard
Le Tue, 22 Nov 2005 01:00:35 +0100, Jérémy JUST écrivait dans fr.comp.os.linux.configuration:
On Mon, 21 Nov 2005 18:48:52 -0500 Denis Beauregard wrote:
J'ai un fichier de 500 Mo et qui contient environ 50 millions de mots. Le format est le suivant:
12345 mot (ou) mot 12345
Je voudrais trier une telle base de données le plus rapidement possible.
Comment veux-tu la trier? Par simple ordre alphabétique? Par ordre alphabétique sur le mot de chaque ligne? Par ordre numérique sur le nombre de chaque ligne?
Un tri alphabétique par le début de la ligne serait suffisant. D'ailleurs, je pense qu'il est préférable, vu le traitement que je veux faire, de placer le mot au début de la ligne.
Un tri local pourrait aussi être suffisant (trier par bloc de 1 million de lignes par exemple).
Pour le moment, j'ai un utilitaire en DOS qui trie un gros fichier en blocs de 80 000 lignes, mais je trouve que c'est long puisque chaque itération demanderait quelque chose comme 1000 tris.
Avec la commande « sort », tu pourras trier par ordre alphabétique ou numérique, considéré sur le ligne, ou seulement certaines colonnes. Cette commande se débrouille (il me semble) pour écrire des fichiers temporaires, pour ne pas trop charger la mémoire.
Le PC a 250 Mo de mémoire et le fichier fait 500 Mo. Est-ce qu'il n'y a pas un problème d'espace avec un sort traditionnel ? Je veux dire que cela va tellement swapper que cela prendra beaucoup de temps à trier. Mais je m'aperçois que le swap lui-même (tmpfs sur Debian) n'a que 120 Mo.
Si ce n'est pas ce que tu veux, expliques un peu plus en détails, et on pourras peut-être t'aider. Le mieux serait que tu donnes une vingtaine de lignes d'exemple à trier (indique aussi la quantité de mémoire que tu peux allouer au tri, c'est important).
Ce sont des avis de décès.
Repentigny septembre l'âge ans est décédé Lionel Abbott époux feu Yvette Marchand Il laisse dans deuil ses enfants Yves Serge Jocelyne Joëlle
À noter que les accents sont sans importance. Que époux soit avant ou après espace, ce que je veux c'est que tous les époux se suivent. Je vais aussi éliminer les mots communs et peu significatifs, ce qui réduira une partie des données à trier.
Denis
Le Tue, 22 Nov 2005 01:00:35 +0100, Jérémy JUST
<jeremy_just@netcourrier.com> écrivait dans
fr.comp.os.linux.configuration:
On Mon, 21 Nov 2005 18:48:52 -0500
Denis Beauregard <no@nospam.com.invalid> wrote:
J'ai un fichier de 500 Mo et qui contient environ 50 millions
de mots. Le format est le suivant:
12345 mot
(ou)
mot 12345
Je voudrais trier une telle base de données le plus rapidement
possible.
Comment veux-tu la trier? Par simple ordre alphabétique? Par ordre
alphabétique sur le mot de chaque ligne? Par ordre numérique sur le
nombre de chaque ligne?
Un tri alphabétique par le début de la ligne serait suffisant.
D'ailleurs, je pense qu'il est préférable, vu le traitement que je
veux faire, de placer le mot au début de la ligne.
Un tri local pourrait aussi être suffisant (trier par bloc de
1 million de lignes par exemple).
Pour le moment, j'ai un utilitaire en DOS qui trie un gros fichier en
blocs de 80 000 lignes, mais je trouve que c'est long puisque chaque
itération demanderait quelque chose comme 1000 tris.
Avec la commande « sort », tu pourras trier par ordre alphabétique ou
numérique, considéré sur le ligne, ou seulement certaines colonnes.
Cette commande se débrouille (il me semble) pour écrire des fichiers
temporaires, pour ne pas trop charger la mémoire.
Le PC a 250 Mo de mémoire et le fichier fait 500 Mo. Est-ce qu'il n'y
a pas un problème d'espace avec un sort traditionnel ? Je veux dire
que cela va tellement swapper que cela prendra beaucoup de temps à
trier. Mais je m'aperçois que le swap lui-même (tmpfs sur Debian)
n'a que 120 Mo.
Si ce n'est pas ce que tu veux, expliques un peu plus en détails, et
on pourras peut-être t'aider.
Le mieux serait que tu donnes une vingtaine de lignes d'exemple à
trier (indique aussi la quantité de mémoire que tu peux allouer au
tri, c'est important).
Ce sont des avis de décès.
Repentigny
septembre
l'âge
ans
est
décédé
Lionel
Abbott
époux
feu
Yvette
Marchand
Il
laisse
dans
deuil
ses
enfants
Yves
Serge
Jocelyne
Joëlle
À noter que les accents sont sans importance. Que époux soit avant ou
après espace, ce que je veux c'est que tous les époux se suivent.
Je vais aussi éliminer les mots communs et peu significatifs, ce qui
réduira une partie des données à trier.
Le Tue, 22 Nov 2005 01:00:35 +0100, Jérémy JUST écrivait dans fr.comp.os.linux.configuration:
On Mon, 21 Nov 2005 18:48:52 -0500 Denis Beauregard wrote:
J'ai un fichier de 500 Mo et qui contient environ 50 millions de mots. Le format est le suivant:
12345 mot (ou) mot 12345
Je voudrais trier une telle base de données le plus rapidement possible.
Comment veux-tu la trier? Par simple ordre alphabétique? Par ordre alphabétique sur le mot de chaque ligne? Par ordre numérique sur le nombre de chaque ligne?
Un tri alphabétique par le début de la ligne serait suffisant. D'ailleurs, je pense qu'il est préférable, vu le traitement que je veux faire, de placer le mot au début de la ligne.
Un tri local pourrait aussi être suffisant (trier par bloc de 1 million de lignes par exemple).
Pour le moment, j'ai un utilitaire en DOS qui trie un gros fichier en blocs de 80 000 lignes, mais je trouve que c'est long puisque chaque itération demanderait quelque chose comme 1000 tris.
Avec la commande « sort », tu pourras trier par ordre alphabétique ou numérique, considéré sur le ligne, ou seulement certaines colonnes. Cette commande se débrouille (il me semble) pour écrire des fichiers temporaires, pour ne pas trop charger la mémoire.
Le PC a 250 Mo de mémoire et le fichier fait 500 Mo. Est-ce qu'il n'y a pas un problème d'espace avec un sort traditionnel ? Je veux dire que cela va tellement swapper que cela prendra beaucoup de temps à trier. Mais je m'aperçois que le swap lui-même (tmpfs sur Debian) n'a que 120 Mo.
Si ce n'est pas ce que tu veux, expliques un peu plus en détails, et on pourras peut-être t'aider. Le mieux serait que tu donnes une vingtaine de lignes d'exemple à trier (indique aussi la quantité de mémoire que tu peux allouer au tri, c'est important).
Ce sont des avis de décès.
Repentigny septembre l'âge ans est décédé Lionel Abbott époux feu Yvette Marchand Il laisse dans deuil ses enfants Yves Serge Jocelyne Joëlle
À noter que les accents sont sans importance. Que époux soit avant ou après espace, ce que je veux c'est que tous les époux se suivent. Je vais aussi éliminer les mots communs et peu significatifs, ce qui réduira une partie des données à trier.
Denis
Jérémy JUST
On Mon, 21 Nov 2005 20:55:52 -0500 Denis Beauregard wrote:
Un tri alphabétique par le début de la ligne serait suffisant.
Donc le GNU « sort » peut faire l'affaire.
Le PC a 250 Mo de mémoire et le fichier fait 500 Mo. Est-ce qu'il n'y a pas un problème d'espace avec un sort traditionnel ?
En tous cas, il va falloir un gros chausse-pied pour faire tout rentrer en RAM...
Mais je m'aperçois que le swap lui-même (tmpfs sur Debian) n'a que 120 Mo.
Est-ce que tu as quand même assez d'espace-disque quelque part?
Parce que la version GNU de sort peut stocker ses fichiers temporaires sur une partition. Elle travaille suffisamment bien pour ne pas devoir les réécrire autant de fois qu'elle permute des lignes. Jette un oeil à l'option « -T » (par défaut, je pense que c'est /tmp qui est utilisé, ou /var/tmp).
Tu es sur une machine de production? Est-ce qu'elle a le droit de crasher? Si oui, fait un essai avec « sort », tu verras bien si ça passe. Suis la consommation de RAM avec « top ». Et si non, fais un essai sur 100 Mo de données, pour voir comment ça réagit (toujours avec « top »).
À noter que les accents sont sans importance.
Tu pourras appliquer un filtre avant de trier les données, pour les retirer si tu veux (en sed ou Perl).
-- Jérémy JUST
On Mon, 21 Nov 2005 20:55:52 -0500
Denis Beauregard <no@nospam.com.invalid> wrote:
Un tri alphabétique par le début de la ligne serait suffisant.
Donc le GNU « sort » peut faire l'affaire.
Le PC a 250 Mo de mémoire et le fichier fait 500 Mo. Est-ce qu'il n'y
a pas un problème d'espace avec un sort traditionnel ?
En tous cas, il va falloir un gros chausse-pied pour faire tout
rentrer en RAM...
Mais je m'aperçois que le swap lui-même (tmpfs sur Debian) n'a que 120
Mo.
Est-ce que tu as quand même assez d'espace-disque quelque part?
Parce que la version GNU de sort peut stocker ses fichiers temporaires
sur une partition. Elle travaille suffisamment bien pour ne pas devoir
les réécrire autant de fois qu'elle permute des lignes.
Jette un oeil à l'option « -T » (par défaut, je pense que c'est /tmp
qui est utilisé, ou /var/tmp).
Tu es sur une machine de production? Est-ce qu'elle a le droit de
crasher?
Si oui, fait un essai avec « sort », tu verras bien si ça passe. Suis
la consommation de RAM avec « top ».
Et si non, fais un essai sur 100 Mo de données, pour voir comment ça
réagit (toujours avec « top »).
À noter que les accents sont sans importance.
Tu pourras appliquer un filtre avant de trier les données, pour les
retirer si tu veux (en sed ou Perl).
On Mon, 21 Nov 2005 20:55:52 -0500 Denis Beauregard wrote:
Un tri alphabétique par le début de la ligne serait suffisant.
Donc le GNU « sort » peut faire l'affaire.
Le PC a 250 Mo de mémoire et le fichier fait 500 Mo. Est-ce qu'il n'y a pas un problème d'espace avec un sort traditionnel ?
En tous cas, il va falloir un gros chausse-pied pour faire tout rentrer en RAM...
Mais je m'aperçois que le swap lui-même (tmpfs sur Debian) n'a que 120 Mo.
Est-ce que tu as quand même assez d'espace-disque quelque part?
Parce que la version GNU de sort peut stocker ses fichiers temporaires sur une partition. Elle travaille suffisamment bien pour ne pas devoir les réécrire autant de fois qu'elle permute des lignes. Jette un oeil à l'option « -T » (par défaut, je pense que c'est /tmp qui est utilisé, ou /var/tmp).
Tu es sur une machine de production? Est-ce qu'elle a le droit de crasher? Si oui, fait un essai avec « sort », tu verras bien si ça passe. Suis la consommation de RAM avec « top ». Et si non, fais un essai sur 100 Mo de données, pour voir comment ça réagit (toujours avec « top »).
À noter que les accents sont sans importance.
Tu pourras appliquer un filtre avant de trier les données, pour les retirer si tu veux (en sed ou Perl).
-- Jérémy JUST
Nicolas George
Denis Beauregard wrote in message :
Le PC a 250 Mo de mémoire et le fichier fait 500 Mo. Est-ce qu'il n'y a pas un problème d'espace avec un sort traditionnel ?
Il y a plusieurs pages dans TAOCP consacrées au cas d'un tri sur des données ne tenant pas en mémoire centrale, et des algorithmes tout à fait efficaces dans ces circonstances. On peut raisonnablement avoir confiance que les auteurs de sort ont lu ces pages.
Denis Beauregard wrote in message
<cfs4o19fn85ldsp7rin9vlbeqmsjotqn6m@4ax.com>:
Le PC a 250 Mo de mémoire et le fichier fait 500 Mo. Est-ce qu'il n'y
a pas un problème d'espace avec un sort traditionnel ?
Il y a plusieurs pages dans TAOCP consacrées au cas d'un tri sur des données
ne tenant pas en mémoire centrale, et des algorithmes tout à fait efficaces
dans ces circonstances. On peut raisonnablement avoir confiance que les
auteurs de sort ont lu ces pages.
Le PC a 250 Mo de mémoire et le fichier fait 500 Mo. Est-ce qu'il n'y a pas un problème d'espace avec un sort traditionnel ?
Il y a plusieurs pages dans TAOCP consacrées au cas d'un tri sur des données ne tenant pas en mémoire centrale, et des algorithmes tout à fait efficaces dans ces circonstances. On peut raisonnablement avoir confiance que les auteurs de sort ont lu ces pages.
Denis Beauregard
Le Tue, 22 Nov 2005 03:08:18 +0100, Jérémy JUST écrivait dans fr.comp.os.linux.configuration:
On Mon, 21 Nov 2005 20:55:52 -0500 Denis Beauregard wrote:
Un tri alphabétique par le début de la ligne serait suffisant.
Donc le GNU « sort » peut faire l'affaire.
Je viens de lancer le test avec un fichier de 240 Mo. J'ai compté 29 millions de mots. J'ai choisi -T . comme option, donc le tmp est dans le répertoire de travail. Comme il n'y a que le fichier à trier, c'est peu important. Par contre, cela permet de voir comment sort fonctionne. On voit apparaître des fichiers de 3,4 Mo dans le répertoire en question. J'ai l'impression qu'il fait un tri local et qu'ensuite, il fera un tri par intégration.
Dire que dans DOS, j'ai écrit mon propre tri il y a 10 ans environ. En particulier, au lieu de la faible limite de DOS, j'avais monté le nombre de lignes à 100 000 avec un tableau de pointeurs, donc qui occupe 400 ko de mémoire (en DOS, on doit en théorie se limiter aux segments de 64 ko, mais si on utilise autre chose qu'un compilateur de Microsoft, on peut faire des merveilles). Linux est donc beaucoup plus simple puisque le sort fourni est beaucoup plus efficace.
Le PC a 250 Mo de mémoire et le fichier fait 500 Mo. Est-ce qu'il n'y a pas un problème d'espace avec un sort traditionnel ?
En tous cas, il va falloir un gros chausse-pied pour faire tout rentrer en RAM...
sort ne semble pas s'attarder à ce problème et a trié mes 29 millions de mots en moins de 20 minutes. C'est un peu compliqué pour moi car je dois envoyer le fichier à trier vers la machine Linux et le ramener via Windows 95 (je n'ai jamais réussi à configurer Samba et je n'arrive pas à voir le PC Linux depuis Win 98 ni à copier de Linux vers Win 98), mais c'est tout de même beaucoup plus rapide que mon tri sous Windows 98.
Je pense même que j'aurais pu trier sans l'option -T. Quoique je me demande sur quel disque est mon /tmp.
Mais je m'aperçois que le swap lui-même (tmpfs sur Debian) n'a que 120 Mo.
Est-ce que tu as quand même assez d'espace-disque quelque part?
Oui.
Parce que la version GNU de sort peut stocker ses fichiers temporaires sur une partition. Elle travaille suffisamment bien pour ne pas devoir les réécrire autant de fois qu'elle permute des lignes. Jette un oeil à l'option « -T » (par défaut, je pense que c'est /tmp qui est utilisé, ou /var/tmp).
Effectivement, je l'ai utilisé.
Tu es sur une machine de production? Est-ce qu'elle a le droit de crasher? Si oui, fait un essai avec « sort », tu verras bien si ça passe. Suis la consommation de RAM avec « top ». Et si non, fais un essai sur 100 Mo de données, pour voir comment ça réagit (toujours avec « top »).
Excellemment ;-)
À noter que les accents sont sans importance.
Tu pourras appliquer un filtre avant de trier les données, pour les retirer si tu veux (en sed ou Perl).
J'ai regardé les mots les plus communs et je vais sans doute les enlever au moment de l'extraction des mots de la base principale. C'est un programme en C++ écrit pour l'occasion.
Pour les curieux, voici les mots les plus communs de mon texte:
130498 her 134716 laisse 146886 son 151746 du 154346 La 156904 enfants 169289 des 172795 be 175040 by 180820 dans 182216 on 184938 au 215018 St 241394 in 248599 to 301518 ses 314123 at 315849 feu 465998 the 614775 of 667956 and 691640 et
Cela donne 6 millions de mots à ne pas trier.
Merci à tous pour vos conseils.
Denis
Le Tue, 22 Nov 2005 03:08:18 +0100, Jérémy JUST
<jeremy_just@netcourrier.com> écrivait dans
fr.comp.os.linux.configuration:
On Mon, 21 Nov 2005 20:55:52 -0500
Denis Beauregard <no@nospam.com.invalid> wrote:
Un tri alphabétique par le début de la ligne serait suffisant.
Donc le GNU « sort » peut faire l'affaire.
Je viens de lancer le test avec un fichier de 240 Mo. J'ai compté
29 millions de mots. J'ai choisi -T . comme option,
donc le tmp est dans le répertoire de travail. Comme il n'y a que
le fichier à trier, c'est peu important. Par contre, cela permet
de voir comment sort fonctionne. On voit apparaître des fichiers de
3,4 Mo dans le répertoire en question. J'ai l'impression qu'il fait
un tri local et qu'ensuite, il fera un tri par intégration.
Dire que dans DOS, j'ai écrit mon propre tri il y a 10 ans environ.
En particulier, au lieu de la faible limite de DOS, j'avais monté
le nombre de lignes à 100 000 avec un tableau de pointeurs, donc
qui occupe 400 ko de mémoire (en DOS, on doit en théorie se limiter
aux segments de 64 ko, mais si on utilise autre chose qu'un
compilateur de Microsoft, on peut faire des merveilles). Linux est
donc beaucoup plus simple puisque le sort fourni est beaucoup plus
efficace.
Le PC a 250 Mo de mémoire et le fichier fait 500 Mo. Est-ce qu'il n'y
a pas un problème d'espace avec un sort traditionnel ?
En tous cas, il va falloir un gros chausse-pied pour faire tout
rentrer en RAM...
sort ne semble pas s'attarder à ce problème et a trié mes 29
millions de mots en moins de 20 minutes. C'est un peu compliqué pour
moi car je dois envoyer le fichier à trier vers la machine Linux
et le ramener via Windows 95 (je n'ai jamais réussi à configurer
Samba et je n'arrive pas à voir le PC Linux depuis Win 98 ni à copier
de Linux vers Win 98), mais c'est tout de même beaucoup plus rapide
que mon tri sous Windows 98.
Je pense même que j'aurais pu trier sans l'option -T. Quoique je me
demande sur quel disque est mon /tmp.
Mais je m'aperçois que le swap lui-même (tmpfs sur Debian) n'a que 120
Mo.
Est-ce que tu as quand même assez d'espace-disque quelque part?
Oui.
Parce que la version GNU de sort peut stocker ses fichiers temporaires
sur une partition. Elle travaille suffisamment bien pour ne pas devoir
les réécrire autant de fois qu'elle permute des lignes.
Jette un oeil à l'option « -T » (par défaut, je pense que c'est /tmp
qui est utilisé, ou /var/tmp).
Effectivement, je l'ai utilisé.
Tu es sur une machine de production? Est-ce qu'elle a le droit de
crasher?
Si oui, fait un essai avec « sort », tu verras bien si ça passe. Suis
la consommation de RAM avec « top ».
Et si non, fais un essai sur 100 Mo de données, pour voir comment ça
réagit (toujours avec « top »).
Excellemment ;-)
À noter que les accents sont sans importance.
Tu pourras appliquer un filtre avant de trier les données, pour les
retirer si tu veux (en sed ou Perl).
J'ai regardé les mots les plus communs et je vais sans doute les
enlever au moment de l'extraction des mots de la base principale.
C'est un programme en C++ écrit pour l'occasion.
Pour les curieux, voici les mots les plus communs de mon texte:
130498 her
134716 laisse
146886 son
151746 du
154346 La
156904 enfants
169289 des
172795 be
175040 by
180820 dans
182216 on
184938 au
215018 St
241394 in
248599 to
301518 ses
314123 at
315849 feu
465998 the
614775 of
667956 and
691640 et
Le Tue, 22 Nov 2005 03:08:18 +0100, Jérémy JUST écrivait dans fr.comp.os.linux.configuration:
On Mon, 21 Nov 2005 20:55:52 -0500 Denis Beauregard wrote:
Un tri alphabétique par le début de la ligne serait suffisant.
Donc le GNU « sort » peut faire l'affaire.
Je viens de lancer le test avec un fichier de 240 Mo. J'ai compté 29 millions de mots. J'ai choisi -T . comme option, donc le tmp est dans le répertoire de travail. Comme il n'y a que le fichier à trier, c'est peu important. Par contre, cela permet de voir comment sort fonctionne. On voit apparaître des fichiers de 3,4 Mo dans le répertoire en question. J'ai l'impression qu'il fait un tri local et qu'ensuite, il fera un tri par intégration.
Dire que dans DOS, j'ai écrit mon propre tri il y a 10 ans environ. En particulier, au lieu de la faible limite de DOS, j'avais monté le nombre de lignes à 100 000 avec un tableau de pointeurs, donc qui occupe 400 ko de mémoire (en DOS, on doit en théorie se limiter aux segments de 64 ko, mais si on utilise autre chose qu'un compilateur de Microsoft, on peut faire des merveilles). Linux est donc beaucoup plus simple puisque le sort fourni est beaucoup plus efficace.
Le PC a 250 Mo de mémoire et le fichier fait 500 Mo. Est-ce qu'il n'y a pas un problème d'espace avec un sort traditionnel ?
En tous cas, il va falloir un gros chausse-pied pour faire tout rentrer en RAM...
sort ne semble pas s'attarder à ce problème et a trié mes 29 millions de mots en moins de 20 minutes. C'est un peu compliqué pour moi car je dois envoyer le fichier à trier vers la machine Linux et le ramener via Windows 95 (je n'ai jamais réussi à configurer Samba et je n'arrive pas à voir le PC Linux depuis Win 98 ni à copier de Linux vers Win 98), mais c'est tout de même beaucoup plus rapide que mon tri sous Windows 98.
Je pense même que j'aurais pu trier sans l'option -T. Quoique je me demande sur quel disque est mon /tmp.
Mais je m'aperçois que le swap lui-même (tmpfs sur Debian) n'a que 120 Mo.
Est-ce que tu as quand même assez d'espace-disque quelque part?
Oui.
Parce que la version GNU de sort peut stocker ses fichiers temporaires sur une partition. Elle travaille suffisamment bien pour ne pas devoir les réécrire autant de fois qu'elle permute des lignes. Jette un oeil à l'option « -T » (par défaut, je pense que c'est /tmp qui est utilisé, ou /var/tmp).
Effectivement, je l'ai utilisé.
Tu es sur une machine de production? Est-ce qu'elle a le droit de crasher? Si oui, fait un essai avec « sort », tu verras bien si ça passe. Suis la consommation de RAM avec « top ». Et si non, fais un essai sur 100 Mo de données, pour voir comment ça réagit (toujours avec « top »).
Excellemment ;-)
À noter que les accents sont sans importance.
Tu pourras appliquer un filtre avant de trier les données, pour les retirer si tu veux (en sed ou Perl).
J'ai regardé les mots les plus communs et je vais sans doute les enlever au moment de l'extraction des mots de la base principale. C'est un programme en C++ écrit pour l'occasion.
Pour les curieux, voici les mots les plus communs de mon texte:
130498 her 134716 laisse 146886 son 151746 du 154346 La 156904 enfants 169289 des 172795 be 175040 by 180820 dans 182216 on 184938 au 215018 St 241394 in 248599 to 301518 ses 314123 at 315849 feu 465998 the 614775 of 667956 and 691640 et
Cela donne 6 millions de mots à ne pas trier.
Merci à tous pour vos conseils.
Denis
noone
C'est un peu compliqué pour moi car je dois envoyer le fichier à trier vers la machine Linux et le ramener via Windows 95 (je n'ai jamais réussi à configurer Samba et je n'arrive pas à voir le PC Linux depuis Win 98 ni à copier de Linux vers Win 98), mais c'est tout de même beaucoup plus rapide que mon tri sous Windows 98.
Au pire tu peux installer Cygwin ou MinGW sur ton Windows comme ça tu auras les outils GNU à disposition sur ton Win
par contre niveau perf je en sais pas
C'est un peu compliqué pour
moi car je dois envoyer le fichier à trier vers la machine Linux
et le ramener via Windows 95 (je n'ai jamais réussi à configurer
Samba et je n'arrive pas à voir le PC Linux depuis Win 98 ni à copier
de Linux vers Win 98), mais c'est tout de même beaucoup plus rapide
que mon tri sous Windows 98.
Au pire tu peux installer Cygwin ou MinGW sur ton Windows comme ça tu
auras les outils GNU à disposition sur ton Win
C'est un peu compliqué pour moi car je dois envoyer le fichier à trier vers la machine Linux et le ramener via Windows 95 (je n'ai jamais réussi à configurer Samba et je n'arrive pas à voir le PC Linux depuis Win 98 ni à copier de Linux vers Win 98), mais c'est tout de même beaucoup plus rapide que mon tri sous Windows 98.
Au pire tu peux installer Cygwin ou MinGW sur ton Windows comme ça tu auras les outils GNU à disposition sur ton Win
par contre niveau perf je en sais pas
Jérémy JUST
On Tue, 22 Nov 2005 04:11:26 +0100 "TiChou" wrote:
À noter que les accents sont sans importance. Tu pourras appliquer un filtre avant de trier les données, pour les
retirer si tu veux (en sed ou Perl). La variable d'environnement LC_COLLATE avec la bonne locale (ici fr_FR
ou ) n'est-elle justement pas là pour éviter les problèmes de tris avec les caractères étendus ? ;-)
Oui, si on interprète la phrase « les accents sont sans importance » comme « je veux trier comme on le fait dans le dictionnaire » (ce qui est très probable). À ma première lecture, j'avais compris ça comme « considérer une lettre accentuée comme égale à sa lettre non accentuée » (ce qui ne doit pas correspondre à ce que veut le PO).
-- Jérémy JUST
On Tue, 22 Nov 2005 04:11:26 +0100
"TiChou" <gro.uohcit@uohcit> wrote:
À noter que les accents sont sans importance.
Tu pourras appliquer un filtre avant de trier les données, pour les
retirer si tu veux (en sed ou Perl).
La variable d'environnement LC_COLLATE avec la bonne locale (ici fr_FR
ou fr_FR@euro) n'est-elle justement pas là pour éviter les problèmes
de tris avec les caractères étendus ? ;-)
Oui, si on interprète la phrase « les accents sont sans importance »
comme « je veux trier comme on le fait dans le dictionnaire » (ce qui
est très probable).
À ma première lecture, j'avais compris ça comme « considérer une
lettre accentuée comme égale à sa lettre non accentuée » (ce qui ne
doit pas correspondre à ce que veut le PO).
On Tue, 22 Nov 2005 04:11:26 +0100 "TiChou" wrote:
À noter que les accents sont sans importance. Tu pourras appliquer un filtre avant de trier les données, pour les
retirer si tu veux (en sed ou Perl). La variable d'environnement LC_COLLATE avec la bonne locale (ici fr_FR
ou ) n'est-elle justement pas là pour éviter les problèmes de tris avec les caractères étendus ? ;-)
Oui, si on interprète la phrase « les accents sont sans importance » comme « je veux trier comme on le fait dans le dictionnaire » (ce qui est très probable). À ma première lecture, j'avais compris ça comme « considérer une lettre accentuée comme égale à sa lettre non accentuée » (ce qui ne doit pas correspondre à ce que veut le PO).
-- Jérémy JUST
Denis Beauregard
Le Tue, 22 Nov 2005 12:55:36 +0100, Jérémy JUST écrivait dans fr.comp.os.linux.configuration:
On Tue, 22 Nov 2005 04:11:26 +0100 "TiChou" wrote:
À noter que les accents sont sans importance. Tu pourras appliquer un filtre avant de trier les données, pour les
retirer si tu veux (en sed ou Perl). La variable d'environnement LC_COLLATE avec la bonne locale (ici fr_FR
ou ) n'est-elle justement pas là pour éviter les problèmes de tris avec les caractères étendus ? ;-)
Oui, si on interprète la phrase « les accents sont sans importance » comme « je veux trier comme on le fait dans le dictionnaire » (ce qui est très probable). À ma première lecture, j'avais compris ça comme « considérer une lettre accentuée comme égale à sa lettre non accentuée » (ce qui ne doit pas correspondre à ce que veut le PO).
En fait, ce que je vise, c'est que toutes les occurences du même mot soient à la suite.
Comme je vais faire une recherche avec mysql et like, je devrais sans doute remplacer tous les accents et même les lettres en majuscules par l'équivalent en minuscules.
Denis
Le Tue, 22 Nov 2005 12:55:36 +0100, Jérémy JUST
<jeremy_just@netcourrier.com> écrivait dans
fr.comp.os.linux.configuration:
On Tue, 22 Nov 2005 04:11:26 +0100
"TiChou" <gro.uohcit@uohcit> wrote:
À noter que les accents sont sans importance.
Tu pourras appliquer un filtre avant de trier les données, pour les
retirer si tu veux (en sed ou Perl).
La variable d'environnement LC_COLLATE avec la bonne locale (ici fr_FR
ou fr_FR@euro) n'est-elle justement pas là pour éviter les problèmes
de tris avec les caractères étendus ? ;-)
Oui, si on interprète la phrase « les accents sont sans importance »
comme « je veux trier comme on le fait dans le dictionnaire » (ce qui
est très probable).
À ma première lecture, j'avais compris ça comme « considérer une
lettre accentuée comme égale à sa lettre non accentuée » (ce qui ne
doit pas correspondre à ce que veut le PO).
En fait, ce que je vise, c'est que toutes les occurences du même
mot soient à la suite.
Comme je vais faire une recherche avec mysql et like, je devrais
sans doute remplacer tous les accents et même les lettres en
majuscules par l'équivalent en minuscules.
Le Tue, 22 Nov 2005 12:55:36 +0100, Jérémy JUST écrivait dans fr.comp.os.linux.configuration:
On Tue, 22 Nov 2005 04:11:26 +0100 "TiChou" wrote:
À noter que les accents sont sans importance. Tu pourras appliquer un filtre avant de trier les données, pour les
retirer si tu veux (en sed ou Perl). La variable d'environnement LC_COLLATE avec la bonne locale (ici fr_FR
ou ) n'est-elle justement pas là pour éviter les problèmes de tris avec les caractères étendus ? ;-)
Oui, si on interprète la phrase « les accents sont sans importance » comme « je veux trier comme on le fait dans le dictionnaire » (ce qui est très probable). À ma première lecture, j'avais compris ça comme « considérer une lettre accentuée comme égale à sa lettre non accentuée » (ce qui ne doit pas correspondre à ce que veut le PO).
En fait, ce que je vise, c'est que toutes les occurences du même mot soient à la suite.
Comme je vais faire une recherche avec mysql et like, je devrais sans doute remplacer tous les accents et même les lettres en majuscules par l'équivalent en minuscules.