Bienvenue sur le forum !

Si vous souhaitez rejoindre la communauté, cliquez sur l'un de ces boutons !

Qt 5 : 5.9.1 - Qt Creator : 4.4.0 - Qt Installer : 2.0.3 - JOM : 1.1.2 - Qt Build suite : 1.7.0 - VS Qt 5 : 2.0.0

[Qt4.2.3] Probleme mémoire avec QFile

Salut à Tous,

J'ai un problème désagréable avec les QFile associé avec des QDataStream. Des fichiers binaires contiennent des enregistrements de données brut. C'est fichiers peuvent être très volumineux. C'est fichiers peuvent atteindre le Go.

Les données brutes sont enregistré sous la forme
(A(sur 32 bit) ,B(sur 32 bit) ,et B*8 bits)*X

J'ai donc fais un soft simple basé sur un QTableView permettant de consulter ces données, j'ai donc dériver
le modèle QAbstractTableModel, au vue du volume de données, je ne pouvais évidement pas charger en dure
les données dans la RAM.

J'ai donc passé le nom du fichier concerné, et lorsque la fonction data() est appelé
par la vue, le fichier est ouvert et je vais lire la données demandé dans le fichier, (en utilisant un datastream)
je ferme le fichier, je flush le fichier et le flux fin de l'histoire, fichier ouvert en "unbuffered".

Le problème c'est que au fur et a mesure que je fais défiler ma vue, la quantité de RAM occupé explose et
pire, si j'applique un nouveau modèle dans la vue (pour visualiser un autre fichier) la mémoire n'est pas libéré.

Je ne comprends pas d'où viens le problème, je suis également sur de la source du problème. En effet j'ai implémenté
dans le même programme, au même endroit les fonctionna litées nécessaire en utilisant les APIs basique genre fopen()
read(), seek(), et le programme devient par ce fait très économique en RAM et ne gonfle pas quand je parcours les fichiers

(Ceux qui sont arrivé ici doivent ce dire : pourquoi il nous fait ***** alors ? parcque j'ai certains effets de bords provoqué
par ces fonctions qui peuvent faire planter le programme)

Si quelqu'un avait rencontré le problème, ou pouvait simplement faire un test de sont coté, je fais peut être une erreur
tellement énorme que je ne la vois pas, j'ai dans l'idée que l'object QFile doit mettre en tampon les données qui ont été
appelé par le model en partant du principe que je pourrais de nouveaux en avoir besoin, cependant dans mon cas ce
comportement n'est pas souhaité.

merci au courageux qui sont arrivé au bout,
j'offre une tournée général dans la taverne
du forum si vous pouvez m'aider.

@+
Jc

Réponses

  • Salut,

    Tout d'abord, la solution consistant à ouvrir, seeker et ferme le fichier n'est pas viable, ne serait-ce que par le temps consommé qui risque d'être absurdement long.
    Ensuite, QFile ne bufferise pas de données, donc je ne vois pas ce que tu as à craindre de ce côté. Il ne faut juste pas utiliser QDataStream avec. Ca t'évitera les primitives C.

    A priori, il va te falloir implémenter des fonctionnalités de streaming, je ne vois que 2 façons de faire, mais une petite recherche google pourrait t'en apporter davantage
    > utiliser le mapping de fichier (mmap,... sur linux et CreateFileMapping,... sur win32) => aucune classe Qt
    > seeker à ne plus savoir que faire, tu peux utiliser QFile

    Tu pourrais t'inspirer des techniques utilisées dans les jeux (donc qui ont un haut besoin de performances); tu as par exemple cet article sur Gamasutra qui présente le B.A.BA de la technique.
  • Re-Salut,

    Et bien merci pour ton aide, effectivement c'est le QDatastream qui faisait gonfler méchamment mon occupation mémoire. Ce qui est marrant c'est que je n'ai pas observé le phénomène lors de la création des fichiers. Ce qui est ennuyeux c'est que le datastream a ecrit les entier en bigEndian alors que la lecture par le read ce fait en little endian (ou l'inverse) du coup je ne peux pas utiliser directement les toUInt du QbyteArray pour récupérer mes valeurs, je dois d'abord switcher le tableau et caster vers un entier.

    Bref effectivement juste en QFile et en seek ca marche impec,

    Sinon j'ai lu le truc sur le chargement rapide des fichiers mais dans mon cas ce n'est pas intéressant, puisque je ne dois lire que des petits volumes mais a des intervalles très rapides, sachant que je ne peux pas non plus les charger en RAM car trop volumineux.

    Je vais ouvrir un autre sujet car j'ai un comportement toujours étrange avec les modèles documents/vue.

    Merci du coup de pouce.
Connectez-vous ou Inscrivez-vous pour répondre.