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

Algorithmes et structures de données Discussion :

Meilleur méthode pour gérer une liste des blocks


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut Meilleur méthode pour gérer une liste des blocks


    J'ai un problème, enfin, une sorte de problème. Je suis en train de refaire une des parties de ma "pseudo" base de données. La dernière fois que j'avais eu un problème avec c'était pour une histoire de BTree mais maintenant c'est encore un niveau en dessous : Mon fichier est découpé en blocs de 64 octets chacuns. Tous les 512 blocs forment une page et le moteur charge à chaque fois une page en mémoire. Toute cette partie fonctionne nikel (je me suis même débrouillé pour faire des caches et tout et tout). Le niveau juste au dessus c'est pouvoir organiser les blocs pour pouvoir "émuler" un flux de données (pouvant faire largement plus que 64 octets) et pour l'organisation j'ai du mal.

    Ce que je faisait c'était une liste de blocs chainés (les 8 derniers octets indiquent le numéro du bloc suivant) et ainsi de suite. Cependant pour un flux de 24 Mo pour faire un seek à la position du byte commençant le 23e Mo je me retrouve à devoir lire tous le fichier pour pouvoir y arriver. Y'a t'il donc des documents ou des méthodes sur les méthodes les plus "pratiques" pour stocker l'adresse d'une série de blocs (sachant que cette liste elle aussi doit être contenue dans les blocs ...) ?

  2. #2
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Pourquoi ne pas utiliser des blocs de pointeurs en plus de blocs de données (comme dans ext2 avec "inode" et "data") ?
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  3. #3
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Donc j'aurai un truc genre :

    ptr vers un bloc de données
    ptr vers un bloc de données
    ...
    ptr vers un bloc de données
    ptr vers le bloc suivant

    Mais du coup, pour faire un seek il faut quand même que je lise de manière séquentielle chaque block d'index non ?

  4. #4
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Les blocs d'index ne sont pas obligatoirement structurés en liste chainée : ils peuvent être stucturés sous forme d'arbre pour accélerer les seek (bien sur, au détriment de l'accès purment sequentiel qui necessite un parcours d'arbre)

    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
     
    Index (00-2F)
    -----
    00-0F ---> Index (00-0F)
    10-1F      -----     
    20-2F      00-03 ---> Index (00-03)
    next       04-07      -----
               08-0B      00 -----> data (00)
     |         0C-0F      01 -----> data (01)
     |                    02 -----> data (02)
     |                    03 -----> data (03)
    \|/
     
    Index (30-5F)
    -----
    30-3F
    40-4F
    50-5F
    next
    Regarde les specs sur ext2 pour plus détail.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  5. #5
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Je vais essayer d'implémenter ça :
    * Pour chaque morceau :
    * ulong : ptr vers données ( 64 octets )
    * ulong : ptr vers données ( 64 octets )
    * ulong : ptr vers données ( 64 octets )
    * ulong : ptr vers données ( 64 octets )
    * ulong : ptr vers données ( 64 octets )
    * ulong : ptr vers indirect index ( 512 octets )
    * ulong : ptr vers double indirect index ( 4096 octets )
    * ulong : ptr vers next
    *
    * indirect index :
    * ulong : ptr vers données ( 64 octets ) x 8
    *
    * double indirect index :
    * ulong : ptr vers indirect index ( 512 octets ) x 8
    l'index utilise beaucoup d'espace mais à chaque déplacement dans la chaine je bouge de ~4,5 Ko (contre 64 octets avec une simple liste chainée ...). Sur le papier ça a l'air déjà cool, maintenant je vais en baver pour le faire ...

    edit: tain, pour arriver à 25 Mo il me faudra quand même plus de 5000 blocs lus ...

  6. #6
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par smyley Voir le message
    edit: tain, pour arriver à 25 Mo il me faudra quand même plus de 5000 blocs lus ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    * Pour chaque morceau :
    * ulong : ptr vers données ( 64 octets )
    * ulong : ptr vers données ( 64 octets )
    ...
    Pourquoi faire des nodes de données de seulement 64 octets ? Pourquoi ne pas pointer vers une page entiere (512 blocs x 64 octets = 32ko) ?

    Bien sur, tu auras des pages qui ne seront pas remplies totalement mais est-ce un problème de perdre quelques ko ?
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/04/2014, 12h11
  2. Meilleure méthode pour remplir une liste
    Par kodo dans le forum Général Java
    Réponses: 4
    Dernier message: 15/05/2012, 12h06
  3. Meilleur langage pour gérer une base SQL
    Par carmensam dans le forum Langages de programmation
    Réponses: 4
    Dernier message: 01/05/2008, 17h24
  4. Réponses: 5
    Dernier message: 03/01/2008, 16h07
  5. Meilleure méthode pour vider une JTable
    Par JamesP dans le forum Composants
    Réponses: 9
    Dernier message: 17/08/2007, 11h42

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