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

VB.NET Discussion :

Ecriture fichier stockage gros volume


Sujet :

VB.NET

  1. #1
    Membre du Club
    Homme Profil pro
    valves hydrauliques
    Inscrit en
    Septembre 2006
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : valves hydrauliques
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 68
    Points : 69
    Points
    69
    Par défaut Ecriture fichier stockage gros volume
    Bonjour,

    je develope sous VB.net en version 2010

    Je dois faire une application pour laquelle je dois tout les 30ms stocker 1000 nombres que je reçoit en codage brut sur 32bit.

    Je connais que le stockage en fichier texte avec un system.io.streamwriter, mais c'est surement absolument inadapté, en espace disque, etc.

    Quel est la demarche a suivre, pour stocker des données en format brut dans un fichier ?

    Merci de votre aide

    armin

  2. #2
    Membre expérimenté
    Avatar de charouel
    Homme Profil pro
    Freelance
    Inscrit en
    Mars 2009
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 618
    Points : 1 454
    Points
    1 454
    Billets dans le blog
    9
    Par défaut
    tu peux voire ici

  3. #3
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    1000 nombres integer = 1000*4octets = environ 4ko
    et toutes les 30ms ca fait environ 33 fois par seconde, donc au final moins de 150ko/s

    après juste le nombre seul ca me parrait étonnant, en général on colle une date et un identifiant pour savoir ce que représente le nombre (à voir donc dans ton cas)
    et combien de temps doit tu veux stocker ?

    après faut il relire les données ?

    parce que tout mettre bout à bout dans un fichier texte c'est faisable, mais ce n'est pas forcément ce qu'il y a de plus pratique si tu as une date ou autre (c'est surement ce qu'il y a de plus rapide sinon)

    après il y a la base de données, et là si tu as une date c'est ce qui sera le plus pratique et le plus rapide en lecture sur une période donnée
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Membre du Club
    Homme Profil pro
    valves hydrauliques
    Inscrit en
    Septembre 2006
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : valves hydrauliques
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 68
    Points : 69
    Points
    69
    Par défaut
    bonjour,

    tu peux voire ici :

    merci,

    ma question est : dans le soucie d'etre compact, je veux stocker les données brut.

    Je peux prendre ASCII comme format, et ecrire par example 124 en definissant : Dim a As Char // a = Chr(124) ?
    On peut aligner des nombres de la sorte en faissant des Write, sans jamais faire des Writeline ?
    Il n'y a pas un mode d'ecrire directement les nombres, sans passer par le Chr(xxx) ?


    il s'agit de la surveillance d'un automate qui a environ 1000 variables a gerer.

    Bien sur il y a une variable qui est le temps, ça sera transferé dans une base de données, mais la vitesse d'ecriture pour ecrire en continue dans la base est trop limite (j'ai trouvé en fonction des PC testées entre 15 et 30ms pour ecrire 1000 valeurs dans une table dans Access, et SQL serveur était encore beaucoup plus lent a cause de la gestion du journal de transactions je pense), d'ou l'idee d'ecrire en continue dans un fichier texte, puis de relire dans une base de données après pour le traitement.

    Donc mon soucie premier est, comment ecrire ce gros volume de données avec la charge la plus faible possible pour le pc,et en minimisant le volume.
    Car il s'agit de faire des mesures sur plusieurs journées, et d'examiner en cas de problèmes les données.

    merci

    Armin

  5. #5
    Membre expérimenté Avatar de Uranne-jimmy
    Homme Profil pro
    Bioinformatique
    Inscrit en
    Décembre 2012
    Messages
    778
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Bioinformatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 778
    Points : 1 461
    Points
    1 461
    Par défaut
    Bonjour,
    Je suis pas sûr de faire avancer les choses, mais il ne me coute rien d'essayer :
    Tu souhaites garder en tampon tes données pour permettre à l'automate de continuer à bosser sans avoir à attendre l'enregistrement des données, tu veux passer par un fichier qui récupère toutes les données d'un traitement complet. Je pense que le fichier texte n'est pas le plus adapté, d'un point de vue vitesse comme sécurité. J'aurais simplement gardé dans des variables assez globale l'ensemble des informations, et avant la fin du programme, lancé une procédure qui inscrit tout ce qui a été récupéré dans ta BDD.
    Expert en recherche google caféinomane

  6. #6
    Membre du Club
    Homme Profil pro
    valves hydrauliques
    Inscrit en
    Septembre 2006
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : valves hydrauliques
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 68
    Points : 69
    Points
    69
    Par défaut Merci de ton aide
    Bonjour,

    Pour etre plus claire, les 1000 valeurs sont des valeurs des grandeurs d'un systeme (une machine de 400 MegaWatt de stockage d'energie par pompage), et pendant la mise en service on enregistre tout, pour que en cas d'incidence on peut analyser la defaillance.
    Et les environ 1000 valeurs ont été jugé necessaire.
    Tu me dit en vitesse le fichier texte n'est pas le meilleur, qoui pendre alors ?
    Je connais bien la base de données, mais en vitesse d'écriture c'est forcement plus lent, donc bien prevu d'integrer ça plus tard dans une base, du genre avec un BULK INSERT dans SQLserveur.

    Mais je ne connais pas une methode, pour ecrire des données brut la plus rapidement possible dans un fichier ?
    En charge CPU le fichier texte est deja bien, mais ça me parrait un peu barbare comme traitement.

    Armin

  7. #7
    Membre expérimenté Avatar de Uranne-jimmy
    Homme Profil pro
    Bioinformatique
    Inscrit en
    Décembre 2012
    Messages
    778
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Bioinformatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 778
    Points : 1 461
    Points
    1 461
    Par défaut
    Tu ne sembles pas pouvoir garder ça sous forme de variable jusqu'à la fin du traitement, pour garder la traçabilité en cas d'arrêt impromptu si j'ai bien compris.
    Ca va sans doute un peu trop loin pour mes connaissances, en dehors du fichier texte, il y a le fichier binaire, après je peux pas trop dire lequel est le mieux. J'ai déjà rencontré des applications lourdes qui avait une console qui laissait déroulé un certain nombre de paramètre, et en cas d'arrêt non prévu, le contenu de cette console était copié sur un fichier texte à la racine de l'application, donc passer par un fichier texte n'est pas si barbare que ça.
    Expert en recherche google caféinomane

  8. #8
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    il nous arrive d'avoir plusieurs milliers de valeurs venant d'automates, on en enregistre plusieurs milliers aussi
    mais en général les valeurs ne changent pas toutes en même temps, donc on n'enregistre que quand ca change, donc beaucoup moins, et dans sql server

    par contre notre programme les balaye toutes en ram pour chercher les changements



    après on peut écrire des octets dans un fichier (écrire chr(124) certes, mais ca te laisse alors 255 valeurs seulement)
    et il existe une classe (bitconverter) qui permet de récupérer les x octets d'une variable structure


    après la meilleur raison d'oublier le fichier c'est la sécurité, sql server est prévu pour ne pas perdre de données (sur un os serveur, pas sur windows 7 ^^) un fichier c'est fragile


    sinon il ne faut pas partir avec des suppositions comme le fait qu'sql server va être plus lent qu'access, c'est en testant qu'on a des certitudes (parfois incomplètes )
    il y a différentes manière d'insérer 1000 valeurs et certaines 100x plus rapide que d'autres (faire 1000x insert dans une vraie table c'est lent oui)
    j'ai pas les temps en tête c'est pas moi qui ai codé cette partie là, mais en général on cherche les millisecondes à gratter sur ce genre de chose, donc ca ne doit pas être très loin de 0
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  9. #9
    Membre du Club
    Homme Profil pro
    valves hydrauliques
    Inscrit en
    Septembre 2006
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : valves hydrauliques
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 68
    Points : 69
    Points
    69
    Par défaut Comment ecrire dans un fichier binaire
    Bonjour,

    Merci de tous vos commentaires.

    Il est trop long de rentrer dans tous les details, je ne suis pas maitre de l'automate, je recois seulement une com qui me transfert les données a ce rythme, et l'enregistreur doit tourner sur des pc portables de bureau sans installation autre que le microsoft office.

    Mais ma question est tres simple :

    comment ouvrir un fichier en donnée brut ( je crois on dit binaire ), et lire et ecrire dedans des entiers de 8 bit ou 32 bit alligné les uns derrière les autres ?

    je ne connais pas ce mode access ?

    quelqu'un connait ?

    merci d'avance

    Armin

  10. #10
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    c'est la même méthode que pour écrire du texte

    soit
    system.io.file.writeallbytes/appendallbytes

    soit en gardant le fichier ouvert instancier un filestream et faire du write(octets) dedans
    et avec bitconverter.getallbytes tu auras les octets correspondant à int32 ou autre

    mais bon en cas de coupure de courant ou autre soucis le fichier devient caduque avec des données brutes ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  11. #11
    Membre du Club
    Homme Profil pro
    valves hydrauliques
    Inscrit en
    Septembre 2006
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : valves hydrauliques
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 68
    Points : 69
    Points
    69
    Par défaut Merci de ton aide
    Voila,

    j'ai trouve ma solution.

    merci


    Armin

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

Discussions similaires

  1. Exécution d'un gros volume de requêtes stockées dans un fichier
    Par tomarineo dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 19/03/2015, 11h17
  2. Réponses: 6
    Dernier message: 17/02/2010, 21h32
  3. Ecriture et stockage de données sur un fichier .txt
    Par Olivier.D dans le forum Fortran
    Réponses: 3
    Dernier message: 23/03/2009, 14h05
  4. Comparaison de fichiers très gros volume
    Par tanys dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 27/06/2006, 23h58
  5. Lecture et ecriture fichier .ini
    Par despe dans le forum C
    Réponses: 6
    Dernier message: 23/07/2003, 20h40

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