IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Traitement de fichiers texte long & tableau string


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Juin 2007
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 362
    Par défaut Traitement de fichiers texte long & tableau string
    Bonjour,

    Je travaille avec 2 fichiers texte long (environ 85 000 lignes chacun)

    Je stocke donc ces fichiers dans des tableaux de string sur lesquels je viens boucler sur chaque itération.

    Le truc c'est que ca prend énormément de temps de boucler sur chaque fichier.

    Y a t il une solution autre que tableau de string pour travailler sur les données concernées ? Je ne veux pas créer de base de données pour ce cas là.

    merci

  2. #2
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 479
    Par défaut
    Je ne vois pas bien d'autres méthode que de charger les donnes en mémoire dans des tableaux de string comme tu l'a fait.
    Ça coince où ? Lors du chargement en mémoire où quand tu fais ton traitement ?
    Voir du codé de la parallélisation si possible ?
    Si tu poste ton code on peut peut-être t'aider à l'optimiser ?

  3. #3
    Membre éclairé
    Inscrit en
    Juin 2007
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 362
    Par défaut
    En fait ces 2 fichiers sont une extraction de données d'une base de données.

    Donc j'ai fichier A et fichier B.

    Pour chaque ligne de fichier A, je récupère des données communes entre A et B pour au final créer un fichier C qui sera une "jointure" des 2 fichiers.

    Donc à un moment donné, pour une ligne du fichier A, je fais boucler mon programme sur tout le fichier B etc etc..donc c'est très long.

    Pour certains traitement, j'avais fait des thread, mais bon peu de gain au final...

  4. #4
    Membre Expert Avatar de sisqo60
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2006
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 754
    Par défaut
    Bonjour,

    D'après ce que tu dis, une ligne de ton fichier B a une référence vers une ligne de ton fichier A. Peut-être qu'en triant les lignes de tes 2 fichiers en fonction de la référence de la ligne de ton fichier A, tu pourras gagner du temps...

    L'association en un troisième fichier sera forcément plus rapide. A voir car le tri prend du temps aussi

    Sinon postes nous du code, pour qu'on puisse réellement t'aider.

    Bon dév.

  5. #5
    Membre Expert
    Avatar de azstar
    Homme Profil pro
    Architecte Technique BizTalk/.NET
    Inscrit en
    Juillet 2008
    Messages
    1 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Technique BizTalk/.NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 198
    Par défaut
    si nous connaissons un peu d'informations sur le contenu de deux fichiers je pense que nos réponses vont être plus utiles et ciblées

  6. #6
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    231
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2008
    Messages : 231
    Par défaut
    Peux tu nous donner un peu plus d'information sur la structure de ta donnée.
    Tu dis que pour chaque "Ligne" de A tu boucle sur tout B ? mais es ce qu'à une donnée de A correspond plusieurs ligne de B mais à une ligne de B correspond une ligne de A ? En gros es ce que tu as une liaison 1-N ou N-N ?

    Une solution serait de monter tout le fichier B en mémoire. Et donc de manière multithread de consulter les lignes de A pour faire la correspondance avec les données de B. * Dans le cas d'une liaison 1-N tu pourrais réduire ta List<string> en retirant les données consommées.

    Si tu ne peux pas monter tout le fichier B en mémoire. Dans le cas d'un 1-N cela veut dire que tu peux supprimer la donnée au fur et à mesure de la consommation. C'est à dire qu'à chaque extraction d'une ligne B tu la supprime du fichier.

    Au passage la monté de ton fichier en mémoire aujourd'hui n'est forcément énorme. Je fais une supposition, une ligne = 255 caractères.

    1 caractère = 1 byte
    1*255*80000 = 20 400 000 byte
    (20 400 000 / 1024) / 1024 = (environ) 20 MByte (Mo)

    Mais ce calcul se fait sur une supposition bien sur.

    Pour la première solution, si tu es en 4.0 tu pourrais utiliser des PLINQ c'est pas mal pour traiter des listes rapidement

  7. #7
    Membre éclairé
    Inscrit en
    Juin 2007
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 362
    Par défaut
    LEs 2 fichiers s'apparentent à du CSV dans la structure. J'ai x colonnes séparées par une tabulation.
    La première colonne des 2 fichiers est un champ "ident", car mes 2 fichiers proviennent de 2 systèmes d'informations différent (bdd)

    Donc je charge le fichier A, puis à partir d'un foreach je lis la première ligne.
    Je récupère mon élément "ident", et je parcours le fichier B à la recherche de la ligne qui contient cet identifiant. Si je le trouve, je récupère une information précise de la ligne du fichier B concernée.

    Je stocke ensuite la ligne A + l'information du fichier B dans une List<string> que j'incrémente au besoin.

    Une fois que tout mon fichier A est bouclé, j'exporte dans un fichier texte les informations "ligne A + information B".

    Je suis donc en solution N-N car un élément de B peut correspondre à plusieurs A...

  8. #8
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Bonjour

    Citation Envoyé par Freud44 Voir le message
    En fait ces 2 fichiers sont une extraction de données d'une base de données.
    Il ne serait pas plus simple de travailler sur la base de données avant extraction ? Pour traiter des données c'est ce qu'il y a quand même de plus efficace.

    Et si ce n'est pas possible, pourquoi ne pas réécrire les fichiers dans des tables temporaires qui permettront également de faire faire le boulot par le SGBD, qui est a priori mieux armé pour cela ?

  9. #9
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Effectivement

    BlueDeep a raison je n'avais pas lu que les fichiers textes etaient extrait d'une BD

    Je comprends donc boucoup moins cette necessité de jointure sur les fichiers texte

    Sauf si les condition de jointures sont particulierement complexe !

  10. #10
    Membre éclairé
    Inscrit en
    Juin 2007
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 362
    Par défaut
    L'un des fichiers provient d'un AS400, l'autre d'un SGBD classique.

    Effectivement je pourrais faire des tables temporaires, j'y avais bien pensé, surtout que pour ce genre de jointure entre 2 fichiers, un sgbd est fait pour ça, sauf que nous n'avons pas le temps de redévelopper un peu de spécifique pour lancer la jointure.

  11. #11
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Donc des List et un Comparer !

Discussions similaires

  1. Stocker un fichier texte dans un tableau de String
    Par Daniel777 dans le forum Android
    Réponses: 6
    Dernier message: 23/06/2014, 08h59
  2. Stocker un fichier text dans un tableau de String
    Par marouene_ dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 20/06/2014, 00h02
  3. [Tableaux] Stocker un fichier texte dans un tableau
    Par clairette59 dans le forum Langage
    Réponses: 13
    Dernier message: 27/01/2006, 23h48
  4. Réponses: 5
    Dernier message: 15/05/2005, 08h51
  5. [Fichier] Lire un fichier texte long
    Par _Eric_ dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 18/08/2004, 15h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo