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 :

Stockage d'une grande quantité de String


Sujet :

Android

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2007
    Messages : 47
    Points : 32
    Points
    32
    Par défaut Stockage d'une grande quantité de String
    Bonjour à tous,

    voila dans mon application, je génère une énorme liste de string qui contiennent des urls, que j'utilise pour ensuite lancer des téléchargement d'images. Et j'utilise une asynctask pour effectuer les boucles qui remplissent mon tableau de string.

    Pour être plus détaillé, j'essaie de faire un système pour télécharger les images de mapquest pour faire un système de carte hors-ligne.

    Actuellement je stocke mes string dans un ArrayList<String> mais lorsque je dépasse les 200000 enregistrement mon application plante et je me retrouve avec un out of memory. Ce n'est pas très surprenant en fait.

    Je voulais savoir quel est la best practice pour ce genre de cas?

    Merci d'avance et bonne journée

  2. #2
    Expert confirmé
    Avatar de Hephaistos007
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2004
    Messages
    2 493
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 493
    Points : 4 166
    Points
    4 166
    Par défaut
    Stockes tes chaines sous forme de fichiers (bdd, fichiers plats) et ne les charge en mémoire (via ArrayList) que 1000 par 1000 par exemple. Ainsi il n'y en aura que 1000 simultanément en mémoire. Ce principe est appelé LazzyLoading mais tu risques de devoir l'implémenter toi-même.
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes --- devise SHADOKS

    Kit de survie Android : mon guide pour apprendre à programmer sur Android, mon tutoriel sur les web services et enfin l'outil en ligne pour vous faire gagner du temps - N'oubliez pas de consulter la FAQ Android

  3. #3
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Ça semblait évident que beaucoup de string dans l'array , ca n'allait pas tenir ...

    Plus sérieusement le fait de passer par une bdd va te permettre d'interrompre ton traitement et de le reprendre plus tard de manière très simple. Ça sera un peu plus lent qu'un tableau en mémoire mais au final plus pratique.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2007
    Messages : 47
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par grunk Voir le message
    Ça semblait évident que beaucoup de string dans l'array , ca n'allait pas tenir ...



    sinon oui, j'avais penser à utiliser une base de donnée effectivement. Je vais réfléchir à la meilleure solution.

    Merci du conseil à vous deux

  5. #5
    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
    Autre suggestion, puisque tu "génère" la liste de String, qu'est-ce qui t'empeche de la générer au fur et à mesure que tu progresse dans tes téléchargement?

    Parce que si tu fais grosso modo

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    pour i de 1 à 500000
     liste.add(genererURL(i));
    pour chaque url de liste faire
      télécharger le fichier

    autant directement faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    pour i de 1 à 500000
      télécharger le fichier (genererURL(i))

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2007
    Messages : 47
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Autre suggestion, puisque tu "génère" la liste de String, qu'est-ce qui t'empeche de la générer au fur et à mesure que tu progresse dans tes téléchargement?

    Parce que si tu fais grosso modo

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    pour i de 1 à 500000
     liste.add(genererURL(i));
    pour chaque url de liste faire
      télécharger le fichier

    autant directement faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    pour i de 1 à 500000
      télécharger le fichier (genererURL(i))

    oui c'est une option aussi mais j'ai peur que ça ne fasse que d'engorger le téléchargement du coup?

    Me trompe-je?

  7. #7
    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
    Ben en quoi le fait de mettre d'abord ça dans une liste désengorgerait le téléchargement?

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2007
    Messages : 47
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Ben en quoi le fait de mettre d'abord ça dans une liste désengorgerait le téléchargement?
    j'en sais rien... en fait je suis même pas sur que ma technique de téléchargement soit terrible...

    J'utilise une async task pour télécharger genre 200'000 jpeg. Je trouve ça un peu violent. Mais je vois pas comment améliorer les choses.

    Des idées??

  9. #9
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Avant ça, il faudra avoir plus d'info sur le contexte.

    De base, télécharger autant d'images en "une fois" me semble une folie (hormis certains contexte très particulier).

    Le principe serait de télécharger uniquement celles dont tu as besoin, avec un système de cache.
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2007
    Messages : 47
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par Hizin Voir le message
    Avant ça, il faudra avoir plus d'info sur le contexte.

    De base, télécharger autant d'images en "une fois" me semble une folie (hormis certains contexte très particulier).

    Le principe serait de télécharger uniquement celles dont tu as besoin, avec un système de cache.
    Alors pour le contexte, l'idée c'est de télécharger les images d'open street map(mapquest en l’occurrence, OSM ne veulent pas qu'on télécharge leurs données directement, ce que je comprend). Ce sont des jpeg de 256*256px qui font environ 10ko.

    Pas très lourd mais très nombreux. Car pour chaque niveau de zoom, on double le nombre d'image, c'est exponentiel. C'est images ne sont pas afficher dans l'application, mais copier sur la SD pour être ensuite utilisé comme système de carte hors-ligne.

  11. #11
    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
    200,000*10k, 2G de données. La batterie et le quota 3G vont apprécier

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2007
    Messages : 47
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    200,000*10k, 2G de données. La batterie et le quota 3G vont apprécier
    Comme tout bon gps, j'annonce qu'il est conseillé d'utiliser le wifi avant de télécharger bla bla bla

  13. #13
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Merci.

    Citation Envoyé par Sofute
    [...] lorsque je dépasse les 200000 enregistrement[...]
    Citation Envoyé par Sofute
    Ce sont des jpeg de 256*256px qui font environ 10ko.
    10 Ko * 200 000 = 2 000 000 Ko
    2 M Ko / 1 024 = 1 953, 125 Mo
    1 953, 125 Mo / 1024 = 1,91 Go

    Es-tu sûr que ce n'est "pas grand chose" ?
    Va faire mal au forfait data.

    L'optim' que je vois : télécharger normalement les zones visualisées (et potentiellement celles qui leur sont connexes) par l'utilisateur, et uniquement celles-ci. Les autres ne seront pas disponibles en "hors-ligne" (dans ce cas, prévenir l'utilisateur).
    C'est ce que te conseillait Hephaistos007 : utiliser du lazy loading (i.e. : charger ce dont on a besoin, et pas plus).

    Tu auras potentiellement un problème de cache (prise en compte de la mise à jour d'une image).
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  14. #14
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2007
    Messages : 47
    Points : 32
    Points
    32
    Par défaut
    en fait c'est justement lorsqu'un utilisateur va dans un pays étranger et qu'il n'as pas de forfait de roaming ou autre, donc pas de connexion data du tout lorsqu'il utilise l'appli. Du coup, il télécharge la carte du pays dans lequel il est sur le wifi de son hotel.
    Pour exemple les 2 go, c'est uniquement pour la suisse. Je me réjouis pas de traiter la Russie

    Mais je vais peut-être limité le zoom maximal qu'il peut télécharger, histoire de limiter les dégâts.

  15. #15
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2007
    Messages : 47
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Autre suggestion, puisque tu "génère" la liste de String, qu'est-ce qui t'empeche de la générer au fur et à mesure que tu progresse dans tes téléchargement?

    Parce que si tu fais grosso modo

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    pour i de 1 à 500000
     liste.add(genererURL(i));
    pour chaque url de liste faire
      télécharger le fichier

    autant directement faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    pour i de 1 à 500000
      télécharger le fichier (genererURL(i))
    je viens de tester cette méthode, effectivement ça à l'air de bien fonctionner
    Mais je suis encore inquiet à propos des performances pour télécharger autant de fichiers!

  16. #16
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Ah vi, j'avais raté un échange de message sur les tailles tient

    Pas vraiment moyen de faire autrement, écran "télécharger pays XXXX" avec recommandation du Wifi (si possible estimation de la taille).
    Mettre des contrôles supplémentaires sur la taille dispo sur la SD avant de lancer le téléchargement (éviter les DL inutiles).

    Avec tes explications et le contexte, je trouve étonnant tout de même que tu arrives sur une OOM. Je n'ai jamais essayé de DL autant sur mobile, mais ayant utilisé des applications faisant ce genre de DL, ça me surprends. Pourrait-on voir la stacktrace ? Question bête : tu n'utilises pas d'objet Drawable (ou assimilé) pour le DL (je suis quasi sûr que non, sinon ça crasherait bien plus tôt, mais bon) ?
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  17. #17
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2007
    Messages : 47
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par Hizin Voir le message
    [...] Avec tes explications et le contexte, je trouve étonnant tout de même que tu arrives sur une OOM.[...]
    En fait je l'avais sur un arraylist que je remplissais avec les urls. Mais j'ai changé de méthode, et j'envoie directement les téléchargements maintenant.

    Ça à l'air de bien fonctionner. Mais je reste prudent quant au fait que j'utilise la bonne méthode pour télécharger. Ou pas?!

    Citation Envoyé par Hizin Voir le message
    Question bête : tu n'utilises pas d'objet Drawable (ou assimilé) pour le DL (je suis quasi sûr que non, sinon ça crasherait bien plus tôt, mais bon) ?
    Non, je fait tout en binaire. Directement enregistrer en fichier sur la sd.

  18. #18
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Je dirai que tu utilises la bonne méthode, et que tu ne peux pas vraiment faire autrement.
    Il est nécessaire, dans ce cas, de ne pas passer par des images, uniquement par flux et fichiers.
    Après, ça se raffine pour les interruptions de DL intempestives, les DL en parallèles...

    Ton éclatement de mémoire devait provenir de la List<String> monstrueuse plus que des DL je pense.
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  19. #19
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2007
    Messages : 47
    Points : 32
    Points
    32
    Par défaut
    oui complétement la liste était beaucoup trop gourmande.

    Merci du coup de main

    Résolu!

  20. #20
    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
    Attention quand même quand tu dit
    Citation Envoyé par Sofute Voir le message
    j'essaie de faire un système pour télécharger les images de mapquest pour faire un système de carte hors-ligne.
    Les conditions d'utilisation de MapQuest te l'interdisent il me semble:

    you may not create derivative works of the Materials, use any data mining, robots, or similar data gathering and extraction tools on the Materials, frame any portion of the Materials

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 11
    Dernier message: 23/09/2008, 15h39
  2. Une grande quantité de données sur Oracle 8i?
    Par bliml dans le forum Oracle
    Réponses: 13
    Dernier message: 01/03/2007, 11h45
  3. Réponses: 1
    Dernier message: 10/01/2007, 15h52
  4. Réponses: 2
    Dernier message: 02/05/2006, 01h00
  5. [C#] [ADO] Parcours d'une grande quantité d'enregistrements
    Par Wavyx dans le forum Windows Forms
    Réponses: 4
    Dernier message: 21/09/2004, 09h16

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