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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2007
    Messages : 47
    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
    Membre Expert
    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
    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 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

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

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    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
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2007
    Messages : 47
    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
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    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
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2007
    Messages : 47
    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
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Ben en quoi le fait de mettre d'abord ça dans une liste désengorgerait le téléchargement?

  8. #8
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2007
    Messages : 47
    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 : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    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
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2007
    Messages : 47
    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!

  11. #11
    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 : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    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

  12. #12
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2007
    Messages : 47
    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.

  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 : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    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

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    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

  15. #15
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2007
    Messages : 47
    Par défaut
    en fait selon le site de mapquest:

    Terms of Use

    The MapQuest Open Tiles are available for use for free under the following conditions:

    If using the MapQuest-OSM tiles, OpenStreetMap must be given credit for the data – see this section of OSM's legal FAQ for details. [...]
    source : http://developer.mapquest.com/web/products/open/map

    donc c'est bon pour peu qu'on respecte le fait de citer la provenance des images.

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

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