Algorithme performant croisement fichier Email

Résolu
cs_vladam Messages postés 216 Date d'inscription dimanche 13 janvier 2002 Statut Modérateur Dernière intervention 7 novembre 2009 - 24 déc. 2008 à 13:46
cs_vladam Messages postés 216 Date d'inscription dimanche 13 janvier 2002 Statut Modérateur Dernière intervention 7 novembre 2009 - 26 déc. 2008 à 14:51
Bonjour,

   J'ai deux fichiers texte, avec dans chacuns d'eux une liste de mail. Le premier est la liste complète de mes abonnés (newsletter) et le second est la liste des abonnés ayant ouvert ma dernière newsletter. les fichiers sont des fichiers texte, avec un mail par ligne (pas de séparateur, juste un retour à la ligne pour chaque record).
   Je veux faire une fonction me permettant de ressortir la liste de tous les Email, n'yant pas ouvert ma newsletter. Donc :
   Je veux comparer le fichier A avec le fichier B pour ressortir tous les mails du fichier A qui sont aussi dans le fichier B.
   Je suis sûr qu'il existe un algorithme dans existant pour optimiser au maximum le temps de traitement (ma fonction doit exécuter cela le plus rapidement possible, avec + de 130 000 records dans chaque fichier).

   Merci pour votre aide, pour ceux qui connaissent.

vladam
(pour vous servir :) )

5 réponses

cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
25 déc. 2008 à 10:44
C'est possible, mais je ne pense pas que LINQ soit une très bonne idée car il fera de bête comparaisons entre tout les éléments...
Il doit y'avoir moyen de faire mieux,  peut-être en rangeant les éléments dans une hashtable (pour la clef, éven. la première lettre de l'adresse eMail?).

<hr />
-Blog-
-Site Perso-
3
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
24 déc. 2008 à 14:07
Salut,

Avec une requete linq c'est surement possible ;-)
Avec le mot cles EXCEPT

L'optimisation est faite je crois par les yield qui sont générés par le compilateur.

Bon coding
0
cs_vladam Messages postés 216 Date d'inscription dimanche 13 janvier 2002 Statut Modérateur Dernière intervention 7 novembre 2009
26 déc. 2008 à 12:06
Bonjour,

Je ne veux pas utiliser LINQ, car au niveau optimisation, c'est très moyen. Disons que LINQ n'est pas vraiment fait pour faire ça, même s'il peut se connecter a des fichiers textes.
L'idée du HashTable n'est pas bête en effet, mais peut-il tenir plusieurs centaines de milliers de record, pas sur ...

vladam
(pour vous servir :) )
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
26 déc. 2008 à 12:52
Pour linq,

Je ne pensais pas a travailler sur le fichier texte directement, mais en chargeant les lignes dans une list<string>

En suite pour la hashtable tu es limité à la taille de ta mémoire
pour pas avoir trop de perte de performance tu peux à l'instanciation choisir une capacity
importante de facon ca ce que cette derniere ne soit pas recalculer quand les paniers sont trop pleins.

De toute facon, tu peux tenter les deux méthodes et comparer les résultat au niveau
temps (avec un stopwatch) et occupation memoire.

Bon courage
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_vladam Messages postés 216 Date d'inscription dimanche 13 janvier 2002 Statut Modérateur Dernière intervention 7 novembre 2009
26 déc. 2008 à 14:51
Voila, ça tourne !

Je charge le premier fichier (le plus gros) en mémoire dans des listes de ma création (liste chainées encapsulées dans une liste chainée circulaire).
Cela me permet d'associer une liste d'index en plus avec les domaines.
La première liste chainée circulaire me permet d'indexer la première lettre des émails. Chaque éléments de cette liste circulaire est une liste simple de ses composants.
Pendant le chargement, je place aussi tous les domaines différents dans un HashTable afin de générer à la fin une table d'index.
Top performance ;)
c'est plus une conception de type C++, mais c'est plus performant qu'en utilisant le framework.Net uniquement.

vladam
(pour vous servir :) )
0
Rejoignez-nous