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 :

Optimisation en accès lecture/écriture de fichier et divers


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2011
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2011
    Messages : 204
    Par défaut Optimisation en accès lecture/écriture de fichier et divers
    Bonsoir,

    Avant tout, laissez-moi vous expliquer ce en quoi consiste mon humble projet afin de savoir ce que je recherche précisément. Dans le but de m'améliorer en C#, j'ai décidé il y a peu de temps de créer une application de découpage de fichiers (autrement dit, un "splitteur").

    Il reçoit en entrée (via une GUI) le fichier à découper ainsi que la taille que devront avoir les paquets résultants. En sortie, on obtient un certain nombre de fichiers découpés à la bonne taille. Évidemment, il est possible de les réassembler à l'aide de cette même application.

    Le format de fichier utilisé n'a rien de fantastique : des méta-données utiles au réassemblage suivies du contenu du fichier découpé; les méta-données contenant diverses informations telles que le hash MD5 du fichier d'origine (à des fins de contrôle d'intégrité), le nom du fichier original (stocké en Unicode) et d'autres informations du même acabit...

    L'application fonctionne bien et fait son travail comme il se doit. Le problème est que j'ai maintenant envie de l'optimiser quelque peu.

    Tout d'abord, l'écriture et la lecture des fichiers sont relativement lentes. Quelles sont les optimisations possibles à ce niveau ? Personnellement, j'ai utilisé des FileStream et des BinaryReader/BinaryWriter pour les manipuler. Est-ce que définir un buffer plus grand que celui par défaut (lors de l'initialisation) change radicalement la donne ?

    J'ai aussi entendu parlé des fichiers mappés en mémoire. Peuvent-ils m'être utiles dans ce cas précis, sachant que les fichiers peuvent être petits comme immenses (plusieurs Go).

    Une autre question est de savoir de quelle manière puis-je implémenter une fonction de création d'archive SFX (auto-extractible) ? J'imagine qu'il faille embarquer du code pré-compilé qui enroberait le binaire du fichier à extraire, si vous me comprenez...

    Merci beaucoup pour votre aide que j'espère déjà être très enrichissante

    Volgaan

  2. #2
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Bonjour,

    Pour optimiser, tu peux faire du MultiThread (c'est aujourd'hui une solution incontournable quand on veut tirer parti de la puissance apportée par les MultiCore).

    On peut par exemple créer un thread pour le lecture et plusieurs threads (en fonction du nombre de core) pour le formatage et l'écriture.

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Graffito Voir le message
    Pour optimiser, tu peux faire du MultiThread (c'est aujourd'hui une solution incontournable quand on veut tirer parti de la puissance apportée par les MultiCore).
    C'est valable pour des traitement intensifs en calculs, pas pour des tâches d'IO comme c'est le cas ici... si tous les fichiers sont sur le même disque, le fait de faire plusieurs lectures/écritures à la fois va plus ralentir le traitement qu'autre chose

  4. #4
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    C'est valable pour des traitement intensifs en calculs, pas pour des tâches d'IO comme c'est le cas ici...
    Probable, si on ne fait pratiquement que de l'IO .

    Dans ce cas, éviter au maximum d'alterner lectures et écritures:
    • lire le maximum en mémoire (disons 1Go) en faisant attention à ne pas allouer des milliers/millions de petits objets.
    • traiter les formattages et écritures avant de continuer les lectures

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2011
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2011
    Messages : 204
    Par défaut
    Citation Envoyé par Graffito Voir le message
    Probable, si on ne fait pratiquement que de l'IO .

    Dans ce cas, éviter au maximum d'alterner lectures et écritures:
    • lire le maximum en mémoire (disons 1Go) en faisant attention à ne pas allouer des milliers/millions de petits objets.
    • traiter les formattages et écritures avant de continuer les lectures
    Donc je devrais éviter d'écrire directement chaque octet qui est lu et les stocker dans un buffer intermédiaire ?

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Volgaan Voir le message
    Donc je devrais éviter d'écrire directement chaque octet qui est lu et les stocker dans un buffer intermédiaire ?
    Tu veux dire qu'actuellement tu lis et écris les octets un par un ? Là c'est sûr que ce n'est pas très efficace... utilise plutôt un buffer. Commence par une taille de 4096 octets (taille d'un bloc en NTFS), et essaie éventuellement de faire varier pour trouver la taille optimale

Discussions similaires

  1. Erreur d'accès en lecture/écriture à un fichier Excel !
    Par Mistraldor dans le forum Général Dotnet
    Réponses: 0
    Dernier message: 17/08/2011, 14h39
  2. Lecture/écriture de fichiers de configuration
    Par Matthieu Brucher dans le forum Boost
    Réponses: 13
    Dernier message: 10/11/2008, 19h31
  3. Accés lecture écriture à un répertoire ?
    Par delphino7 dans le forum Windows Serveur
    Réponses: 1
    Dernier message: 09/05/2008, 20h42
  4. [VS2005]lecture/écriture dans fichier binaire
    Par shadowmoon dans le forum Windows Forms
    Réponses: 10
    Dernier message: 25/09/2007, 17h30
  5. Lecture/écriture de fichiers UTF 16 LE
    Par Pill_S dans le forum Delphi
    Réponses: 8
    Dernier message: 19/12/2006, 18h08

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