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 :

Creer fichier taille fixe


Sujet :

C++

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 223
    Points : 193
    Points
    193
    Par défaut Creer fichier taille fixe
    Bonjour.

    Suite à un précédent post concernant l'estimation du temps nécessaire à la copie des données d'une partition A vers une partition B, de nouvelles questions apparaissent.

    La méthode retenue pour cette estimation de temps, est de copier un fichier de X Mo de la partition A vers la partition B. De calculer le temps nécessaire a ces X Mo, et d'en déduire, via un produit en croix, le temps nécessaire a la copie des Y Mo, Y étant la taille de la totalité des données de la partition A.

    De cette manière, j'ai réussi a avoir une estimation du temps, de l'ordre de la seconde, ce qui me suffit largement. Le problème qui se pose, c'est la création de ce fichier de X Mo.

    Pour le moment, je créé un fichier texte, et je le rempli de char, jusqu'à atteindre les 20Mo, tout ceci au travers d'une boucle FOR. Mais tout ce temps de création de fichier (qui avoisine les 3 ou 4s), c'est du temps de perdu.

    J'en arrive enfin a ma question. Existe-il une methode plus intelligente, et surtout, plus rapide, afin de créer un fichier de taille fixe ? Sachant que la taille minimum est de l'ordre de la 20éne de Mo.

    A défaut, existe t'il une methode qui s'utilise de telle sorte qu'il soit possible d'indiquer : "Tu copie 20Mo, pas plus, même si ce fichier en fait 250" ?

    Merci

    Cordialement,
    PKO
    Quand c'est trop, c'est pas bon !

  2. #2
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Pourquoi ne pas créer une bonne fois pour toute le fichiers de 20 mo?


    (n'étant pas dans la précédente discussion je sais pas si y'a des contraintes spéciales)
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 223
    Points : 193
    Points
    193
    Par défaut
    Bonjour.

    Ce fichier de 20Mo est en fait comparable a une sonde. Il n'est la que pour l'estimation, une fois cette estimation de temps calculée, on n'utilise plus de fichier de 20 Mo.

    La création ne me pose pas de problème, ce qui me pose problème, c'est que le temps de création de ce fichier est une pure perte de temps.

    - Je créé un fichier de 20Mo (4s)
    - Je copier ce fichier de A vers B (Le temps de copie, c'est ce que je cherche à avoir)
    - Je supprime de fichier de 20 Mo

    Les étapes 1 et 3 ne servent à rien.
    2 Solutions s'offrent à moi :

    - Avoir la possibilité de copier seulement 20Mo de quelque chose d'existant, quelque soit la taille de ce quelque chose.
    - Créer un fichier de 20Mo de manière quasi instantanée.

    Cordialement,
    PKO
    Quand c'est trop, c'est pas bon !

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par Altess Voir le message
    A défaut, existe t'il une methode qui s'utilise de telle sorte qu'il soit possible d'indiquer : "Tu copie 20Mo, pas plus, même si ce fichier en fait 250" ?
    En C++, facile:
    • Tu ouvres un fichier binaire en écriture
    • Tu copies 20 mo
    • Tu fermes le fichier binaire


    Sinon, créer un fichier directement avec 20Mo, avec les fonctions Win32:
    • CreateFile()
    • SetFilePointer()
    • SetEndOfFile().
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 223
    Points : 193
    Points
    193
    Par défaut
    Médinoc > Bonjour. Décidément, tu as réponse à toutes mes interrogations .
    Je vais de ce pas tester ces 2 méthodes. En espérant qu'elle me permettent d'économiser ces quelques secondes.

    Cordialement,
    PKO
    Quand c'est trop, c'est pas bon !

  6. #6
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Coy,
    Citation Envoyé par Altess Voir le message
    Bonjour.

    Ce fichier de 20Mo est en fait comparable a une sonde. Il n'est la que pour l'estimation, une fois cette estimation de temps calculée, on n'utilise plus de fichier de 20 Mo.

    La création ne me pose pas de problème, ce qui me pose problème, c'est que le temps de création de ce fichier est une pure perte de temps.

    - Je créé un fichier de 20Mo (4s)
    - Je copier ce fichier de A vers B (Le temps de copie, c'est ce que je cherche à avoir)
    - Je supprime de fichier de 20 Mo

    Les étapes 1 et 3 ne servent à rien.
    2 Solutions s'offrent à moi :

    - Avoir la possibilité de copier seulement 20Mo de quelque chose d'existant, quelque soit la taille de ce quelque chose.
    - Créer un fichier de 20Mo de manière quasi instantanée.

    Cordialement,
    PKO
    Pas la peine de chercher, rien ne peut être instantané.

    Généralement, on ne fait pas comme ça : on mesure constamment le temps mis pour copier jusqu'au point où on en est, et on en déduit le temps restant.

    C'est aussi simple et plus précis, car ça tient compte de ce que la machine peut faire au moment où on le fait.

    Ça pose un tout petit problème transitoire au début de la copie, car bien évidemment la mesure n'est pas précise dans les premières secondes, mais ça s'ajuste assez rapidement (tu as bien dû voir ça quand tu fais des copies dans l'explorateur de ton système).
    Si les cons volaient, il ferait nuit à midi.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 223
    Points : 193
    Points
    193
    Par défaut
    Bonjour.

    Oui, effectivement, rien n'est instantané, mais certaines choses peuvent le paraitre .

    Le fait est que je ne souhaite pas lancer la copie de toutes les données de ma partition A vers ma partition B, en sachant que la copie de 20 Mo (50/60Mo semble être suffisant pour une estimation plus ou moins correcte) atteint déjà un temps beaucoup trop élevé.

    Pour résumer ce qui a ete dit dans le post précédent :
    - J'estime le temps de copie de la totalité de mes données de la partition A vers B
    - Si il est supérieur a 3min, je ne copie pas
    - Sinon, je copie.

    Je reste conscient que l'estimation est très imprécise. Si on bidouille la machine pendant la copie, on va atteindre une estimation totalement erronée.
    Quand c'est trop, c'est pas bon !

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Bonjour,
    Un petit conseil : d'où vient ton besoin initial de ne pas faire de copie si le temps peut dépasser 3'. Je te pose cette question car j'ai l'impression que tu pars sur une usine à gaz pour un problème qui peut peut-être s'aborder autrement.

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 223
    Points : 193
    Points
    193
    Par défaut
    En fait je part sur une application qui nécessite la création de partition.
    Cette création de partition peut s'effectuer de 2 manières :

    -Soit je reboot sur un OS secondaire qui permet la creation des partitions
    -Soit je fait cette creation directement, sans reboot.

    Le soucis avec la première solution, c'est la perte de temps (encore une fois, le temps est une chose que je redoute) causée par le reboot (x2).

    Donc, si je me rend compte que le traitement sans reboot (celui là même qui nécessite la copie) est plus long que le traitement avec reboot, et bien je vais d'office a la première solution. Sinon, je fait ca avec la deuxième.

    Ca peut paraitre assez "bordélique", je l'admet, mais c'est comme ca
    Quand c'est trop, c'est pas bon !

  10. #10
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Dans ton application, cette procédure va être faite :
    1/ 1 fois par l'utilisateur à l'install/config,
    2/ de temps en temps (<1 fois par semaine)
    3/ régulièrement ( 1 fois par jour)
    4/ constamment (plusieurs fois par jour).
    Si la réponse est 1 ou 2, à mon avis, tu perds ton temps.
    Si la réponse est 3, ça se réfléchie : peut être utiliser l'opportunité de le faire en fin de session...
    Si la réponse est 4, OK, il peut être pertinent de commencer à bidouiller.

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 223
    Points : 193
    Points
    193
    Par défaut
    1/ Une fois, a la configuration. Le bidouillage des partitions n'est nécessaire qu'une seule fois. Je suis conscient que c'est lourd, mais j'ai commencé, ca m'ennuierais de ne pas finir. A terme, si il s'avère que c'est inutile, ce code sautera.

    Malgré cela, nos échanges d'informations (du moins, en ce qui me concerne) sont loin d'être des pertes de temps. C'est toujours bon de savoir de nouvelle chose, même si a première vu elle semble obsolète dans telle ou telle situation

    Cordialement,
    PKO
    Quand c'est trop, c'est pas bon !

  12. #12
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Je suis d'accord que c'est intéressant dans une démarche d'apprentissage. Maintenant pour avancer efficacement dans un projet, il faut savoir aussi se concentrer sur les points importants du projet...

    Après, tu peux opter pour une solution intermédiaire un peu plus bourrin : tu n'estimes plus le temps de copie mais tu fais ton choix entre la première et la second alternative selon la taille total de ce que tu aurais souhaité copier. Certes, dire "100 Mo, c'est aujourd'hui à peu près X minutes", c'est prendre le risque que dans 5 ans, X soit divisé par un facteur 2 ou 3. Mais en toute franchise, d'ici 5 ans, ou tu auras produit une nouvelle version permettant d'ajuster le tout ou ... ton projet sera mort. L'informatique est cruelle...

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 223
    Points : 193
    Points
    193
    Par défaut
    Archi > Merci pour ces quelques conseils. Je comprend tout à fait ce que tu veux dire.

    La solution que tu propose est effectivement à prendre en compte. Et malgré la cruauté de l'informatique, je prend le risque ...

    Enfin, pour en revenir au sujet, qui malgré son faible intérêt, m'intéresse , j'ai testé la proposition de Medinoc :

    * CreateFile()
    * SetFilePointer()
    * SetEndOfFile()

    Et la création est extrêmement rapide. Ce qui me convient parfaitement.
    Que ce soit 20Mo ou 2Go, le temps est presque invisible.

    Merci à tous pour vos réponses.

    Cordialement,
    PKO
    Quand c'est trop, c'est pas bon !

  14. #14
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Altess Voir le message
    j'ai testé la proposition de Medinoc :

    * CreateFile()
    * SetFilePointer()
    * SetEndOfFile()

    Et la création est extrêmement rapide. Ce qui me convient parfaitement.
    Que ce soit 20Mo ou 2Go, le temps est presque invisible.
    Que vas-tu faire si la création du fichier échoue ... C'est pour ça que je parlais de solution 'usine à gaz'.

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 223
    Points : 193
    Points
    193
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Que vas-tu faire si la création du fichier échoue ... C'est pour ça que je parlais de solution 'usine à gaz'.
    C'est une éventualité à prendre en compte. A moi d'être assez intelligent pour la gérer. Pour en revenir à l'usine à gaz, il est clair que ça en prend le chemin, mais j'y tiens a cette application .
    Quand c'est trop, c'est pas bon !

  16. #16
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Sinon, en POSIX, tu as cette fonction: http://www.opengroup.org/onlinepubs/...ftruncate.html
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  17. #17
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    La proposition a peut être été déjà faite, dans cette discussion ou dans celle d'origine, mais...

    Finalement, pourquoi créer un fichier de 20 Mb

    Les faits sont que:
    • la taille des fichiers à copier est parfois bien inférieure à 20 Mb, et parfois très largement supérieure (on peut trouver aussi bien des ficheirs de quelques k à peine que des fichiers de 700Mb... ou plus)
    • La vitesse à laquelle les fichiers seront copier peut varier en fonction de la taille des fichiers, mais aussi de la position des partions (celle d'origine et celle de destination) sur le disque dur, de la norme utilisée pour le branchement (IDE, SATA, SATAII, eSATA, USB...) du "cache" du disque dur, du fait que, si la copie se fait sur deux disques séparés, les disques sont branchés sur le même controleur (surtout s'ils sont IDE) ou non, j'en passe et de meilleures...

    Si on ne peut effectivement pas faire grand chose sur les aspects issus du matériel, on peut, par contre, "afiner" l'évaluation du temps en travaillant de deux manières différentes, qui auront, de toutes façons, toutes deux l'énorme avantage de t'éviter le besoin de créer puis de supprimer un fichier "sonde"...

    L'une des solution est de sélectionner (pourquoi pas de manière aléatoire) n'importe quel dossier de la partition à copier, de calculer la taille totale des fichiers à copier, et de te baser sur le temps de copie du dossier complet pour évaluer le temps qui sera nécessaire

    L'avantage, c'est que tu as d'avantage de chances d'avoir - dans le dossier choisi - un échantillon de fichiers qui correspondra bien mieux à ce que l'on trouve sur l'ensemble du disque dur, avec des (très) petits fichiers et de (très) gros

    La deuxième solution est celle qui est régulièrement utilisée: sachant la taille totale à copier, tu vérifie régulièrement (toutes les X secondes) la taille totale copiée et tu fais un "simple" règle de trois avec le temps déjà passé à la copie
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Exporter en fichier txt avec taille fix
    Par ryaxx dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 08/12/2014, 15h50
  2. creer fichier excel
    Par nicoweb371 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/12/2005, 11h04
  3. Créer fichier texte
    Par wareq dans le forum Shell et commandes GNU
    Réponses: 10
    Dernier message: 29/09/2005, 22h36
  4. [Fichier] Taille d'un fichier
    Par Pedro dans le forum Langage
    Réponses: 14
    Dernier message: 08/07/2004, 13h26

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