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 :

scanner de lecture de fichier extrêmement lent


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Par défaut scanner de lecture de fichier extrêmement lent
    Bonjour les amis !

    J'ai besoin de vos lumière dans l'espoir de sortir quelque peu de l'obscurité dans laquelle je suis plongé....lorsque je charge mon fichier ( qui me semble plutôt légers ) et que je vois avec effroi qu'il lui faut un temps infini ( enfin quelques dizaines de secondes ), pour le parcourir et recopier les données.


    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
     
        void load(String file){
     
                try( Scanner scanner = new Scanner( new InputStreamReader( context.openFileInput(file) ) )){
                    int sX = scanner.nextInt(), sY = scanner.nextInt() ;
     
                    relief = new Float[sX][sY] ;
                    pos = new Pf[sX][sY] ;
                    v = new ArrayMap[sX][sY] ;
                    surface.renderer.defineWorldTable(sX,sY);
     
                    for ( int x = 0 ; x < relief.length-1 ; x ++ ){
                        for ( int y = 0 ; y < relief[0].length-1 ; y ++ ){
                            relief[x][y] = ((float)scanner.nextInt())/1000 ;
                            pos[x][y] = new Pf( ((float)scanner.nextInt())/1000, ((float)scanner.nextInt())/1000) ;
                            v[x][y] = new ArrayMap<String,Float>();
                            int size = scanner.nextInt() ;
                            for ( int c = 0 ; c < size ; c ++ ){
                                v[x][y].put(scanner.next(), (float)(scanner.nextInt()/1000));
                            }
                        }
                    }
                    Log.d("loaded","_APRES UN TEMPS VRAIMENT LONG ET PÉNIBLE, LE CHARGEMENT EST...mais...il est parti ?! Zut, tanpis je vais repointer a pol emploie.);
     
                }catch (IOException e){
     
                }
            }
    En l’occurrence je charge des données de tableau mesurant 130 par 130.

    Est-ce normal, suis-je destiné a rester plongé dans l'obscurité infamante et avilissante lorsque j'essaye de charger des données ?
    Ou connaissez vous un chemin Noble et Vertueux, qui mène vers la Lumière tel un assesseur puissant et rapide montant a toute allure vers le sommet d'un haut immeuble aux murs transparents laissant admirer a celui qui l'empreinte le cœur serein un paysage splendide ?

    PS : une autre chose, le scanner.nextFloat(), ne fonctionne pas voilà pourquoi j'ai utilisé un Int que j'écris en transformant depuis un Float divisé par 1000 et lis en le multipliant par 1000...
    Tel un myope qui, pour monter, empreinte en tâtonnant les sombres escaliers que l'on trouve a l'arrière des immeubles dans des ruelles glauques de New York, destinés plutôt a servir aux Hommes courant a toute allure pour les descendre, effrayés par l'alerte qui sonne lors des incendies....ou aux gens mal famés qui se livrent a des commerces douteux pour assurer en ce monde leur maigre subsistance.

    Bref, merci de votre compréhension, et un grand merci a celui qui m'apportera ses Lumières....(quand bien même ce serait pour me confirmer que l'obscurité est parfois en ce monde, un passage nécessaire ) .

    Bien a vous, Mazertys.

    ( ps : vu la monotonie qu'implique parfois la programmation je me suis permis d'apporter un peu de nuance dans la formule, avec l'espoir d'apporter a celui qui lit, un peu de divertissement en espérant avoir fait mon office tout en aspirant néanmoins a une réponse au combien nécessaire et salvatrice dans l'avancée de mon laborieux projet ).

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Premièrement, Scanner.nextFloat() fonctionne très bien. Seulement c'est localisé. Donc si ta locale par défaut est FR, les floats doivent être écrits avec une virgule comme séparateur (donc "4,5" et non pas "4.5" par exemple). Si tes floats sont avec des points dans le fichier, tu peux faire par exemple scanner.useLocale(Locale.US); avant de commencer à lire.
    A noter qu'il existe des méthodes du type has.... (hasNextFloat(), hasNextInt()) qui permet de tester si la prochaine valeur correspond à ce qu'on demande, dans le cas où on est pas sûr de ce qu'il y a dans le fichier.

    Pour la lenteur, je ne sais pas (je ne développe pas sur Android). Je n'ai aucun problème pour lire très rapidement (moins d'une seconde même en comptant l'affichage en console) un fichier de 130 * 130 floats. Est-ce que le problème ne vient pas des autres trucs que tu faits pendant la lecture (les ArrayMap, l'appel de la méthode renderer(), tout ça...) ?
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Par défaut
    Merci pour ta réponse.

    J'ai tenté de charger les mêmes donnée dirrectement depuis le main, sans qu'il n'y ait d'autres surfaces ou threads activés, mais le resultat est le même : un temps particulièrement long.


    dans le logcat, il montre que le GC_FOR_ALLOC est utilisé tout le temps et me sort un Grtow heap ( frag case ) régulièrement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ...GC_FOR_ALLOC freed 3K, 44% free 7290K/12932K, paused 14ms, total 14ms
    ...Grow heap (frag case) to 9.217MB for 65552-byte allocation
    ( cependant les données sont tout de même chargées correctement a la fin ).

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Par curiosité, le size obtenu par int size = scanner.nextInt() ;, il peut valloir combien au maximum ?
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Par défaut
    Pour l'instant 2 au maximum .

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Les fichiers, c'est toi qui les génère ? Tu pourrais peut-être utiliser un DataInputStream/DataOutputStream au lieu de fichier texte. Nonobstant que ça ne pourrait pas changer grand chose au niveau temps de lecture (un peu quand même si, parce que pas de parsing), çà ferait des fichiers plus consis et ce serait plus adapté au type de contenu.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

Discussions similaires

  1. Réponses: 2
    Dernier message: 12/05/2011, 19h11
  2. lecture fichier très lente en java
    Par infoinf dans le forum Langage
    Réponses: 6
    Dernier message: 11/09/2010, 21h38
  3. [AS400][Intranet][PC] Lecture de "fichiers" AS400
    Par lando dans le forum Autres SGBD
    Réponses: 4
    Dernier message: 16/07/2003, 11h11
  4. Lecture de fichier
    Par Watcha dans le forum x86 16-bits
    Réponses: 13
    Dernier message: 04/03/2003, 20h43
  5. Lecture de fichiers ".WAV"...
    Par 0x4e84 dans le forum Langage
    Réponses: 2
    Dernier message: 03/09/2002, 09h43

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