2011-06-30 3 views
2

Je télécharge un fichier assez volumineux sur la carte SD d'un périphérique Android (~ 60 Mo). Le téléchargement se passe bien, mais j'ai besoin de récupérer ce fichier dans son intégralité en mémoire. Je sais que c'est un gros morceau de mémoire pour un téléphone intelligent, mais je sais que mon appareil a plus du double de ce montant. Quoi qu'il en soit, mon problème actuel est que je reçois un OutOfMemoryError lors de la lecture du fichier dans un tableau d'octets. Yat-il un moyen d'augmenter la mémoire allouée pour mon application, ou un moyen de "faux" référencer le fichier tout en conservant le fichier dans le stockage externe sans le charger dans la mémoire interne?OutOfMemoryError lors du chargement d'une grande quantité de données dans Android

+0

Vous ne pouvez pas pré-allouer la taille de la mémoire tampon (dans 'InputStream')? Peut-être essayer ça. 60 Mo est beaucoup pour toute application à avoir sans collecte des ordures. Je m'attendrais à Android à louer autant de données à tout moment dans l'application. Vous pouvez également essayer de séparer les données dans un tableau de tableaux d'octets. – hwrdprkns

+0

Votre question n'est pas assez complète. Quel type de données essayez-vous de gérer? –

Répondre

4

Chaque instance de machine virtuelle dans Android possède ce qu'elle appelle un budget VM. C'est essentiellement la quantité maximale de mémoire que l'application entière peut occuper et rien de plus. getRuntime(). maxMemory() vous donnera la taille du budget vm pour votre instance actuelle.

Je pense que le budget peut aller de 16 Mo (G1) à 48 Mo (Moto Xoom). Ces chiffres pourraient être différents alors que j'essaie de me souvenir de la tête.

Habituellement, pour quelque chose comme ça, vous lisiez les données en InputStream et traitiez les données au fur et à mesure que vous les lisiez, mais ne conserviez pas les données elles-mêmes.

S'il s'agit d'un bitmap. Vous pouvez utiliser ...

BitmapFactory.Options options = new BitmapFactory.Options(); 
options.inSampleSize = 4; // Divides the width and height each by 4 when reading the data in. 
Bitmap bitmap = BitmapFactory.decodeFile(String "filePath", options); 
Bitmap bitmap = BitmapFactory.decodeStream(InputStream "fileStream", options); 
+1

Il était de 16 Mo sur G1 ;-) –

+0

Merci, mis à jour le commentaire. Je serais ravi d'avoir un tableau des classes de mémoire sur http://developer.android.com/resources/dashboard/screens.html spécifications vraiment bien par appareil. –

+1

C'est assez simple: –

1

La réponse simple est: Vous devriez vraiment reconsidérer votre design actuel. Pourriez-vous expliquer pourquoi vous auriez besoin de charger 60 Mo de données en mémoire?

+0

cette quantité de données rendrait une base de données plus attrayante, si c'est possible – Snicolas

+0

C'est un fichier binaire propriétaire, et la bibliothèque qui m'a été donnée pour lire ce fichier veut que le tout soit un tableau d'octets ... donc je suis un peu limité à cet égard. –

+0

C'est dur. Il y a d'autres considérations. Peut-être avoir un processus/thread séparé dédié au décodage peut-être avec une relation serveur/client. Cela signifie que le fichier doit être traité sur le serveur, puis téléchargé sur le client et diffusé ou visionné. Ceci est juste un exemple d'une refonte qui pourrait être nécessaire. Bonne chance. – Maurycy

Questions connexes