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

Android Discussion :

Instancier un dictionnaire


Sujet :

Android

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Points : 417
    Points
    417
    Par défaut Instancier un dictionnaire
    Bonjour,

    Voilà mon problème :

    J'ai dans un fichier txt une liste de 300 000 mots classés par ordre alphabétique à raison d'un mot par ligne (environ 3Mo).

    Mon programme va faire régulièrement des recherches dans cette liste (uniquement des requêtes de type "contains(String s)")

    Quelle est la meilleure manière d'implémenter cette liste pour garantir une rapidité d'exécution sous Android ?

    J'ai pensé à un SortedSet, mais ça a l'air déjà trop lourd. Ou alors il ne faut pas instancier mais rechercher directement dans le fichier brut? Mais ça signifie qu'il va falloir parcourir le fichier un grand nombre de fois, et vu sa taille...

    Des idées ?

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Points : 968
    Points
    968
    Par défaut
    Il existe une structure de données faite pour ça (et que j'ai déjà pratiqué).
    Il s'agit du Patricia Tree ou du Radix Tree

  3. #3
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Si tu peux te permettre de le tenir en mémoire et comme le fichier est déjà trié, un simple String[] dans lequel tu fais une recherche dicothomique pourrait suffire. Ca nécessiterait que 19 comparaisons de Strings pour un contains(), ce qui est raisonnable si tu ne fait pas 500.000 recherches

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Points : 417
    Points
    417
    Par défaut
    Merci pour vos idées.
    Je ne connaissais pas du tout Radix tree.

    En fait, pour la recherche, le SortedSet ça passe bien (très rapide).

    Pour la conservation en mémoire, c'est déjà un peu un problème. J'utilise ceci pour un clavier. Est-ce que je peux décemment garder l'instance de mon dictionnaire en mémoire entre deux utilisation du clavier. Si oui, comment ? Est-ce que le String[] offrirait de meilleurs performances dans ce cas?

    Enfin, le vrai problème, c'est l'instanciation. De ce point de vue, le radix tree offrira probablement des performances execrables. Est-ce que vous connaissez un code efficace pour lire mes 300 000 lignes et les mettre dans mon sortedSet (ou autre) ? Est-ce que je pourrais envisager de faire un thred séparé pour faire cette opération sans trop perturber l'utilisateur (gros temps de chargement). Je n'ai encore jamais touché au multiThread...

  5. #5
    Membre extrêmement actif
    Profil pro
    Développeur
    Inscrit en
    Mars 2012
    Messages
    1 969
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2012
    Messages : 1 969
    Points : 3 375
    Points
    3 375
    Par défaut
    300.000 lignes c'est costaud.
    Et le tenir en mémoire, c'est énorme (au moins 1 Mb).
    Je te conseillerai plus un accès db mais les full table scan ne sont jamais bons pour les processeurs.
    Oui, tu devrais utiliser des tâches asynchrones, thread...
    Si la réponse vous a aidé, pensez à cliquer sur +1

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    en tout cas, un SortedSet occupera beaucoup plus de mémoire qu'un String[], combien, ça dépendra de l'implémentation, mais si on prend la base d'un TreeSet ça risque d'être très gourmand avec tous les objets servants juste à l'organisation de l'arbre.

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Points : 417
    Points
    417
    Par défaut
    Ok. J'ai fait un thread séparé. Le résultat est pas trop mal.

    Oui, j'avais utilisé un TreeSet. Tu as raison, je vais utiliser une String[].

    Comment je peux faire pour la garder en mémoire même après la fermeture du clavier ?

    Merci encore pour votre aide

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

Discussions similaires

  1. [Reflection] Instancier un objet
    Par bl@st dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 28/10/2008, 11h09
  2. dictionnaire de données
    Par samiroquai dans le forum Schéma
    Réponses: 16
    Dernier message: 17/07/2008, 01h40
  3. Un fichier dictionnaire ?
    Par portu dans le forum Windows
    Réponses: 6
    Dernier message: 17/04/2007, 15h26
  4. [POO] Instancier un objet avec le nom de la classe
    Par shinchun dans le forum Langage
    Réponses: 4
    Dernier message: 08/06/2006, 13h44
  5. [VB.NET] Instanciation objet (sur class perso.)
    Par DaxTaz dans le forum ASP.NET
    Réponses: 4
    Dernier message: 03/05/2004, 11h07

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