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

Langage C++ Discussion :

Incomprehension sur le Mapping (sous Windows)


Sujet :

Langage C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Septembre 2010
    Messages : 13
    Points : 5
    Points
    5
    Par défaut Incomprehension sur le Mapping (sous Windows)
    Bonjour à tous!
    Alors, dans le cadre d'une application en temps réel, j'ai choisis d'effectuer du mapping (pour la vitesse et surtout car j'utilise des fichiers de plus de 500Mo), mais j'ai quelques soucis, je vous poste le code et je vous explique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    int			file_mapper()
    {
      char			*file;
      HANDLE		fm = NULL;
      HANDLE		fd = NULL;
      char			*data;
      _BY_HANDLE_FILE_INFORMATION *info = NULL;
     
      file = _strdup(correct_path(csv_file)); /* Ici, je remplace les '\' par des '/' histoire que se soit compatible avec api Win32 */
     
      fd = CreateFile(file, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
     
      fm = CreateFileMapping(fd,NULL,PAGE_READONLY, info->nFileSizeHigh, 0, 0);
     
      if (!fm)
      {
        printf ("Error when creating\n");
        return 0;
      }
     
      data = (char*)MapViewOfFile(fm, FILE_MAP_READ, 0, 0, 0);
     
      if (!data)
      {
        printf ("Error when viewing\n");
        CloseHandle(fm);
        return 0;
      }
     
      UnmapViewOfFile(data);
      CloseHandle(fm);
      CloseHandle(fd);
     
      return (0);
    }
    Et le souci, c'est que fd pointe sur 0xFFFFFFFF (ce qui est le retour erreur d'apres le msdn...) et je ne sais pas pourquoi!
    J'ai bien les droits, je suis le seul à utiliser le fichier, enfin je pense faire tout bien (oui je sais je ne serais pas la si c'était le cas ).
    Donc si quelqu'un à une petit idée!
    Merci d'avance!

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    est que fd pointe sur 0xFFFFFFFF (ce qui est le retour erreur d'apres le msdn...)
    Et comme l'indique la même page de la MSDN, utilisez la fonction GetLastError pour avoir des informations supplémentaires.

    Mm. Irma.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Septembre 2010
    Messages : 13
    Points : 5
    Points
    5
    Par défaut Ca avance!
    Bon alors j'ai fait pas mal de test, et, enfaite, maintenant ca marche (une histoire de malloc que j'avais bêtement oublier...)
    Par contre maintenant j'ai un autre souci, j'ai testé avec des petits fichiers, ca marche nickel, avec des fichiers de 80 Mo aussi par contre avec un fichier de 600Mo il me renvoie un message d'erreur 0x8 qui correspond à "ERROR_NOT_ENOUGH_MEMORY 8 (0x8): Not enough storage is available to process this command." ce que je ne comprends pas sachant que j'ai 3Gb de Ram...
    Donc si quelqu'un à une petite idée de la chose!

    edit: Après encore d'autres tests, je peux en ouvrir de 250Mo aussi

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Vos remarques montrent que vous connaissez assez peu de chose sur la gestion mémoire dans un OS moderne.

    La taille de la RAM physique n'a aucune incidence sur le fait d'avoir assez de mémoire virtuelle pour faire l'allocation. La mémoire est virtuelle, et cela depuis les 80286 (voir avant) et Windows NT (1991), pour Linux c’est de base.

    Quand le programme demande 600Mo de mémoire, ce n’est pas 600Mo de mémoires physiques (600Mo/4Ko pages de mémoire physiques), mais 600 Mo de mémoire virtuelle.

    Pour faire simple, en demandant 600Mo de mémoire virtuelle, le programme demande à l’OS de trouver une plage d’adresse dans l’espace adressage du programme (qui est de 4Go pour chaque programme en 32 bits), plus précisément dans le domaine User de cet espace de travail (en 32 bits, c’est 2Go voir 3Go avec les bonnes options dans le fichier de démarrage des OS). Il faut donc que l’OS trouve une plage d’adresse continues ne contenant ni code de l’exécutable, ni de code de dll, ni de données initialisées de l’exécutable, ni celles des dll, ni de tas, ni des piles des threads, ni de fichiers mappés, ni …
    Une fois que la plage est trouvée, l’OS réserve l’espace nécessaire dans le système de swap et configure les descripteurs de pages mémoires correspondants à la plage pour gérer des défauts de pages.
    Au lieu de regarder la mémoire physique, il faut voir l’occupation du swap et la fragmentation de la mémoire virtuelle.

    Oui, je sais, j’aurais du vous prévenir dés le premier poste sur le danger de vouloir mapper des fichiers de 500Mo mais je ne savais pas si vous étiez en 64bits ou pas. Et il est toujours plus formateur de ce prendre le problème que de l’éviter. Et en plus je suis un peu sadique.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Septembre 2010
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Déjà, merci de cette réponse rapide!

    Hum, je pense avoir compris, mais maintenant je me pose d'autres questions:

    1. Existe-il une solution qui pourrait palier à mon problème?

    2. Les jeux-vidéos actuels arrivent à avoir plus de 1Go de Mémoire Virtuelle (j'ose espérer que je dit pas de bêtises...), pourquoi pas moi?

    3. Si j'ai bien compris, la taille de fichier acceptée, vu la façon que j'utilise actuellement, peut varier (beaucoup?) ?

    4. Sur mon PC, j'ai trouvé ceci, concernant le fichier de pagination: Page File: 788MB used, 6085MB available serait-ce le swap dont vous parlez?

    Et sinon, oui, je suis en 32bits, sous WinXp sp3.

    Merci d'avance!

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    1. Existe-il une solution qui pourrait palier à mon problème?
    Je ne connais pas votre problème mais qu'une manière de le résoudre (mapper en fichier de plusieurs centaines de Mo en entier), qui me semble peu judicieuse.

    Exposez le problème initial SVP.

    2. Les jeux-vidéos actuels arrivent à avoir plus de 1Go de Mémoire Virtuelle (j'ose espérer que je dit pas de bêtises...), pourquoi pas moi?
    Chaque process dispose de 2+2Go (User+Kernel) de mémoire virtuelle donc 1Go de mémoire virtuelle réservé, c'est à peine 1/4 de l'espace d'adressage d'un process 32bits.
    C'est le fait d'avoir une plage d'adressage de plusieurs centaines de Mo libre de toute réservation contigüe qui est problématique.
    Si vous ne faite que des réservations de 4Ko ou moins, vous ne serez pas sujet à la fragmentation de l'espace d'adressage, et vous pourrez allouer toutes les plages d'adresse du domaine User (2Go).
    Le problème n'est pas dans la quantité mais dans le fait que la plage doit être contigüe.

    3. Si j'ai bien compris, la taille de fichier acceptée, vu la façon que j'utilise actuellement, peut varier (beaucoup?) ?
    Enormément, et encore plus avec la randomisation des adresses de chargement des dll qui demande à l'OS, pour éviter des trous de sécurité, de charger les dll dans des plages mémoires aléatoires.

    4. Sur mon PC, j'ai trouvé ceci, concernant le fichier de pagination: Page File: 788MB used, 6085MB available serait-ce le swap dont vous parlez
    Oui, c'est le fichier qui contiendra les pages de mémoires des programmes quand celles-ci sont déchargées des pages de mémoires physiques.
    Vu la taille, le problème n'est pas dans le swap mais dans la taille de la plage d'adresse. (Mais ça j'en était à peu près sûr )

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Septembre 2010
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Merci encore une fois de la rapidité!

    Alors mon problème:
    J'ai un fichier csv qui contient 200 colonnes ( a peu près) et toutes les lignes correspondent à des GMT qui se suivent avec un delta de 33ms.
    Je dois ensuite effectuer un affichage graphique de ces valeurs en temps réel.
    Au début je voulais faire la brute et tout mettre en mémoire dans des listes mais je me suis penché sur le mapping.
    Après la solution de découpage, pourquoi pas mais ds ce cas la découpé judicieusement et pas en plein milieu de ligne mais je me demande si en faisant comme ca je ne risque pas de perdre du temps au moment ou je change de pointeur.
    J'espère avoir été assez explicite!

    Merci d'avance encore!

    PS: Je me demandais, le mapping n'est pas trop utilisé, ou il n'y a juste pas beaucoup de monde sur le forum en ce moment, car vous êtes le seul a m'avoir répondu pour le moment!

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    500Mo visualisez en "temps réel", c'est plusieurs centaines d'octets par pixel sur un écran standard.
    Vos utilisateurs, c'est des robots de SkyNet ou des Steve Austin (l'homme qui valait 3 milliards) sous amphétamines.

    La qualité des données doit primer sur la qualité. Les 500Mo sont des données brutes que vous devez synthétiser pour un affichage pertinent.

    500Mo de données, cela ferait longtemps que j'aurais mis une base de données dans la boucle.

    Les bases de données permettent une gestion de grand volume de données, de faire des consolidations de données de manière performante et s'interface très bien avec des outils d'analyse de données comme les outils de data-mining, de génération de rapports, etc...

    Après la solution de découpage, pourquoi pas mais ds ce cas la découpé judicieusement et pas en plein milieu de ligne mais je me demande si en faisant comme ca je ne risque pas de perdre du temps au moment ou je change de pointeur.
    Mon coté proche du silicium dirait qu'il faudrait lire le fichier par blocs multiples 4Ko pour optimiser les routines de cache de fichier de la C-Runtime et le trafic sur le Bus PCI et faire le découpage en ligne dans une seconde étape. Garder le reliquat de la dernière ligne puis lire le bloc suivant etc..

    Mais mon coté architecte me dit d'en profiter pour mettre ces données dans une base de données.

    le mapping n'est pas trop utilisé
    Je crois avoir entendu que sous Linux, ça a des performances calamiteuses.
    Sous Windows, c'est du très bas niveau et les programmeurs utilisent généralement des primitives de plus haut niveau en fonction des bibliothèques et Framework qu'ils utilisent.

    il n'y a juste pas beaucoup de monde sur le forum en ce moment, car vous êtes le seul a m'avoir répondu pour le moment
    C'est que je suis rapide. Mais aussi car vous êtes dans la partie C++ du forum et que vos questions n'ont qu'un lointain rapport avec le C++.

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Septembre 2010
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par bacelar
    500Mo visualisez en "temps réel", c'est plusieurs centaines d'octets par pixel sur un écran standard.
    Vos utilisateurs, c'est des robots de SkyNet ou des Steve Austin (l'homme qui valait 3 milliards) sous amphétamines.
    Alors en faite je ne rejoue pas les 500Mo en même temps, en gros se sont des enregistrements de paramètres (n paramètres pour n colonnes) que je dois affiché tout les delta GMT (un delta = une ligne).

    Citation Envoyé par bacelar
    La qualité des données doit primer sur la quantité. Les 500Mo sont des données brutes que vous devez synthétiser pour un affichage pertinent.
    Non je ne dois pas les synthétiser, je dois tout afficher, c'est une des contraintes. Et d'ailleurs je dois permettre à l'utilisateur de pouvoir accélérer ou ralentir comme bon lui semble (dans ce cas la, pour l'accélération, je devrais surement synthétiser par contre.

    Citation Envoyé par bacelar
    500Mo de données, cela ferait longtemps que j'aurais mis une base de données dans la boucle.

    Les bases de données permettent une gestion de grand volume de données, de faire des consolidations de données de manière performante et s'interface très bien avec des outils d'analyse de données comme les outils de data-mining, de génération de rapports, etc...
    Oui mais dans ce cas, ma base de donnée serait stockée en mémoire non?, donc le même souci que si j'avais fais des listes chainées ou des piles. (Je me trombe p-e).

    Citation Envoyé par bacelar
    Mon coté proche du silicium dirait qu'il faudrait lire le fichier par blocs multiples 4Ko pour optimiser les routines de cache de fichier de la C-Runtime et le trafic sur le Bus PCI et faire le découpage en ligne dans une seconde étape. Garder le reliquat de la dernière ligne puis lire le bloc suivant etc..

    Mais mon coté architecte me dit d'en profiter pour mettre ces données dans une base de données.
    Donc je découpe ma ligne en multiple de 4Ko et ensuite je la mets dans une DB? Ça va prendre un temps fou lors de l'initialisation de mon programme non?
    Et d'ailleurs les temps d'accès d'une base de donnée, ça donne quoi?
    Car je dois afficher des infos toutes les 33ms (au plus rapide).

    Citation Envoyé par bacelar
    Je crois avoir entendu que sous Linux, ça a des performances calamiteuses.
    Sous Windows, c'est du très bas niveau et les programmeurs utilisent généralement des primitives de plus haut niveau en fonction des bibliothèques et Framework qu'ils utilisent.
    Je ne suis pas sur du tout des performances sous linux j'ai entendu (source sur, entre autre mon directeur pédagogique [oui, je suis en école d'info, et la c'est pour mon stage toute ces questions!])


    Citation Envoyé par bacelar
    C'est que je suis rapide. Mais aussi car vous êtes dans la partie C++ du forum et que vos questions n'ont qu'un lointain rapport avec le C++.
    Faut-il que je déplace mon Topic?

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Alors en faite je ne rejoue pas les 500Mo en même temps, en gros se sont des enregistrements de paramètres (n paramètres pour n colonnes) que je dois affiché tout les delta GMT (un delta = une ligne).
    Vous n'affichez donc qu'une ligne à la fois, non ?
    Je parle de l'affichage, pas du stockage.

    Non je ne dois pas les synthétiser, je dois tout afficher, c'est une des contraintes. Et d'ailleurs je dois permettre à l'utilisateur de pouvoir accélérer ou ralentir comme bon lui semble (dans ce cas la, pour l'accélération, je devrais surement synthétiser par contre.
    C'est bien une ligne à la fois, non ?
    Le SGBD fera la synthèse comme des moyennes, des sommes, filtrage par tranche de datetime bien plus vite qu'un programme "classique".

    Oui mais dans ce cas, ma base de donnée serait stockée en mémoire non?, donc le même souci que si j'avais fais des listes chainées ou des piles. (Je me trombe p-e).
    Je pense que vous restez trop proche de votre solution initiale.

    En mettant une base de données dans la solution, le but n'est pas de recréer la base à chaque lancement mais de ne plus utiliser un fichier comme source de données.

    500Mo de données peu difficilement être des données privées d'un utilisateur, ou temporaire.
    Pour pouvoir partager ces données et permettre leur pérennité dans le temps, la base de données est la solution standard. Le gestionnaire de base de données (SGBD : SQL Server, Oracle) est accessible de manière transparente et concurrentielle par plusieurs applications clientes. Le Backup des bases de données est une tâche stratégique et extrêmement bien maitrisée dans les entreprises.

    C'est peut être un projet scolaire avec des bornes, mais il est clair que dans la cas d'une solution en entreprise, un SGBD est la norme.

    En utilisant un SGBD, vous chargez la base de données 1 et une seule fois. Si vous avez de nouvelles données, utilisez les API d'insertion de la base de données. Si vous n'êtes pas mettre du créateur de données, utilisez un fichier qui ne contient que les nouvelles données en entrée d'un importer (programme externe au SGBD ou routine dans le SGBD), qui à la charge de mettre à jour les données dans la base.

    Pour en revenir à vos questions, le SGBD est un programme autonome, spécialement conçu pour le traitement des données. La gestion de la mémoire, des caches, des données sur disques de ces programmes sont le fruit du travail et de l’expérience de dizaines, voir centaines, de développeur sur des décennies. Vous et moi, on ne fera JAMAIS mieux.

    Donc je découpe ma ligne en multiple de 4Ko et ensuite je la mets dans une DB? Ça va prendre un temps fou lors de l'initialisation de mon programme non?
    Et d'ailleurs les temps d'accès d'une base de donnée, ça donne quoi?
    Car je dois afficher des infos toutes les 33ms (au plus rapide).
    Ce travail ne sera fait qu'une fois, dans l'importer (pas dans votre programme), donc sans aucune contrainte importante de temps. C'est un prétraitement. Donc l'optimisation des 4Ko, c'est plus pour le décorum.. Utiliser les outils les plus simples pour "parser" vos données et les mettre dans la base. Les SGBD fournissent souvent des outils graphiques de création d'importer depuis des fichiers, que cela soit des routines internes au SGBD ou un fichier de script utilisable en ligne de commande.

    Utilisant des protocoles "réseaux" optimisées pour le transfert de données, le temps d'accès ne devrait pas poser de problème. Mais il faut que le débit de données soit raisonnable. Si votre SGBD est sur la même machine que votre programme (client du SGBD), bons nombres de SGBD court-circuite les protocoles réseaux pour des protocoles allégés.

    33ms, c'est une éternité, si le volume de données à transmettre est raisonnable.

    Je ne suis pas sur du tout des performances sous linux j'ai entendu (source sur, entre autre mon directeur pédagogique [oui, je suis en école d'info, et la c'est pour mon stage toute ces questions!])
    Alors ? C'est lent ou rapide sous Linux ?

    Faut-il que je déplace mon Topic?
    Je ne suis pas modérateur, et je ne sais pas où devrait être transféré ce fil.

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Septembre 2010
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Alors enfaite c'est un outil de rejeu graphique, je prends un fichier d'enregistrement en entré et j'affiche "choses" qui change et bouge en fonction de ce qu'il y a tout les delta t donc la base de donnée ne convient pas du tout sachant que le fichier passé en paramètre change a chaque fois!

    Sinon mmap (fonction de mapping ds le monde Unix) sous Linux est très rapide!

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Si vous voulez tous gérer et implémenter vous même, vous pouvez sortir l'artillerie lourde du 32bits si votre CPU et votre OS disposent des extensions PAE et AWE.
    http://msdn.microsoft.com/en-us/libr...96(VS.85).aspx
    http://msdn.microsoft.com/en-us/library/aa366527.aspx
    http://msdn.microsoft.com/en-us/library/aa366531.aspx

    Mais avec 500Mo, on peut encoder tout un film et je pense que vos données ont les mêmes "qualités".
    Je pense qu'il faut faire un petit travail de compression et de nettoyage des redondances dans les données. L'importer vers la base peut prendre en charge ce prétraitement.
    Si les données changent très souvent mais ne sont pas temporaires, la base de données est toujours pertinente. Avoir plusieurs rejeu dans la même base est même un avantage.

    N'oubliez pas que les fonctions de filtrage par datetime ou par intervalles de datetime seront automatiquement optimisées par le moteur de la base de données.

    Si vous voulez faire la mise en mémoire et la recherche vous même dans une mémoire PAE, vous en êtes totalement libre mais le moteur de base de données vous battra très vraisemblablement à plate coutume.
    Donc, à moins d'avoir des algorithmes de recherches non standards spécialisés sur le domaine fonctionnel de vos données, tentez une architecture avec un SGBD.

  13. #13
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Un doute m'étreint.
    Si les données sont stocké chronologiquement et que vous devez utiliser ces données de manière aussi chronologique, pourquoi ne pas lire le fichier séquentiellement pour récupérer les informations correspondant à l'instant t courant ?

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Septembre 2010
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Ce serait beaucoup trop lent de lire 200 colonnes, de les traiter et de les afficher en moins de 33 millisecondes.
    Je pense que je vais utiliser le mapping sachant que j'ai réussi a descendre ma taille de fichier a moins de 250mo, avec quand même une sécurité si jamais la création d'un deuxième pointeur si l'espace mémoire ne suffit pas pour un seul pointeur.
    Merci pour votre aide en tout cas, j'aurais appris pas mal de chose sur la gestion de la mémoire!

  15. #15
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ce serait beaucoup trop lent de lire 200 colonnes, de les traiter et de les afficher en moins de 33 millisecondes.
    Franchement, si vous gérez correctement l'utilisation des primitives d'entrée/sortie pour mettre en branle les routines de lectures anticipées des blocks disques.
    Vous obtiendrez une bien meilleure localité des données, donc de bien meilleures performances, et un temps de démarrage sans aucune commune mesure.
    En résumé, si vous travaillez un peu vos données et votre algorithme, vous aurez de bien meilleur performances qu'avec du mapping de fichier.
    Mais un code simple qui marche c'est toujours bon.

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

Discussions similaires

  1. SNMP sur Oracle 10 sous Windows
    Par Wurlitzer dans le forum Administration
    Réponses: 1
    Dernier message: 10/04/2008, 16h58
  2. lire-ecrire sur port pci sous windows NT
    Par nanard36 dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 02/03/2008, 19h14
  3. Connexion depuis Unix sur serveur Mysql sous Windows
    Par krlou dans le forum Installation
    Réponses: 4
    Dernier message: 01/02/2008, 17h32
  4. Reset soft sur un PocketPC (sous Windows CE 3.0).
    Par JM_Cholet dans le forum Windows
    Réponses: 13
    Dernier message: 16/10/2006, 15h56

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