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 :

AsyncTask et OutOfMemoryError: vrai problème ou question de méthode?


Sujet :

Android

  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 535
    Par défaut AsyncTask et OutOfMemoryError: vrai problème ou question de méthode?
    Hello,

    Je reprends le dév sous Android que je n'ai plus touché depuis un moment, et j'ai un problème "mémoire" (OutOfMemoryError)!

    LA question étant de savoir, si c'est un problème de méthode de ma part (pas impossible), ou un vrai soucis de dév...


    Le but:
    -> parser 2 pages d'un fichier PDF, en 2 fois, car un paramètre de recherche & la page de lecture du PDF diffèrent entre la lecture n°1 et la n°2
    -> et récupération des data dans un buffer, pour analyse

    Ma méthode:
    -> j'ai donc la fonction associée à mon bouton, qui se résume à appeler 2 fois mon AsyncTask, chaque fois avec les bons paramètres
    -> les 2 appels fonctionnent très bien en solo, soit l'une,soit l'autre
    -> MAIS les 2 ensemble = crash
    -> PIRE (et c'est là qu'il y a peut être finalement un problème de méthode...), quand je trace les appels
    • d'abord l'appel n°2 se lance d'abord, avant le 1er (après tout pourquoi pas)
    • mais en plus, j'ai les mêmes paramètres (sens, par exemple, alors qu'il vaut bien 1 et 2) lors des 2 appels(????)
    • alors qu'évidement, je lance bien mon AsyncTask avec des param différents pour les 2 appels

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public void update_pdf (View view)
    	{ 
    		Bundle params = new Bundle();
     
    		params.putInt("pageDebut", 1); params.putInt("pageFin", 1); params.putInt("sens", 1); params.putString("arret", "Gare");
    		new AsyncTraiterPdf().execute(params);
     
    		params.clear();
     
    		params.putInt("pageDebut", 3); params.putInt("pageFin", 3); params.putInt("sens", 2); params.putString("arret", "Centre");
    		new AsyncTraiterPdf().execute(params);
    	}
    Les questions:
    -> (1) est-ce-que ça pose vraiment un problème de ressources d'appeler 2 fois (ou plus) 1 AsyncTask?
    (ce qui me semblait plus lisible/propre puisque c'est bien le même objet qui lit le fichier, au final!)

    -> (2) comment expliquer que les traces d'exécution montrent 2 fois les mêmes paramètres, alors qu'ils changent bien entre les 2 appels?

    -> (3) est-ce-que je devrais plutôt n'appeler qu'une seule fois mon AsyncTAsk, en y faisant directement mes 2 traitements différents?

    -> (4) est-ce-qu'un thread serait plus indiqué? quelles différences en fait, comment choisir entre les deux finalement?


    Questions peut être connes pour les experts que vous êtes , mais j'avoue sécher.........
    Sinon, je ne serais pas là!

  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
    Dans ton cas, je pense qu'il faut lancer les 2 AsyncTasks plutôt avec la méthode executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params), que simplement avec execute(params).

    Quant à tes paramètres, ne réutilises pas le même objet. Créées 2 objets Bundle bien distincts, chacun pour son AsyncTask.
    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
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 535
    Par défaut
    Ok, je testerai ça demain.

    Mais quelle est la nuance? Exécution immédiate, du coup? Et quelle incidence sur la mémoire?

  4. #4
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 535
    Par défaut
    Alors, petit résumé:

    (1) bundles
    -> déjà pour les 2 bundles de paramètres différents, effectivement, ça marche!
    -> par contre, j'aimerais bien comprendre pourquoi la formule d'un seul + clear() ne marchait pas... pas logique...

    (2) executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params)
    -> même problème mémoire
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    08-26 13:11:30.200: E/********************DEBUT(1830): sens 1
    08-26 13:11:30.201: E/********************DEBUT(1830): sens 2
    08-26 13:12:16.434: E/dalvikvm-heap(1830): Out of memory on a 65034-byte allocation.
    08-26 13:12:16.460: E/AndroidRuntime(1830): FATAL EXCEPTION: AsyncTask #1
    08-26 13:12:16.460: E/AndroidRuntime(1830): java.lang.RuntimeException: An error occured while executing doInBackground()
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at android.os.AsyncTask$3.done(AsyncTask.java:299)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at java.util.concurrent.FutureTask.run(FutureTask.java:137)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at java.lang.Thread.run(Thread.java:856)
    08-26 13:12:16.460: E/AndroidRuntime(1830): Caused by: java.lang.OutOfMemoryError
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at java.io.ByteArrayOutputStream.<init>(ByteArrayOutputStream.java:63)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at org.apache.fontbox.ttf.MemoryTTFDataStream.<init>(MemoryTTFDataStream.java:45)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at org.apache.fontbox.ttf.TTFParser.parse(TTFParser.java:96)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at org.apache.pdfbox.pdmodel.font.PDTrueTypeFont.<init>(PDTrueTypeFont.java:108)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at org.apache.pdfbox.pdmodel.font.PDFontFactory.createFont(PDFontFactory.java:65)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at org.apache.pdfbox.pdmodel.PDResources.getFont(PDResources.java:74)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at org.apache.pdfbox.contentstream.operator.text.SetFontAndSize.process(SetFontAndSize.java:32)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at org.apache.pdfbox.contentstream.PDFStreamEngine.processOperator(PDFStreamEngine.java:809)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at org.apache.pdfbox.contentstream.PDFStreamEngine.processStreamOperators(PDFStreamEngine.java:471)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at org.apache.pdfbox.contentstream.PDFStreamEngine.processStream(PDFStreamEngine.java:445)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at org.apache.pdfbox.contentstream.PDFStreamEngine.processPage(PDFStreamEngine.java:147)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at org.apache.pdfbox.contentstream.PDFTextStreamEngine.processPage(PDFTextStreamEngine.java:102)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at org.apache.pdfbox.util.PDFTextStripper.processPage(PDFTextStripper.java:333)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at org.apache.pdfbox.util.PDFTextStripper.processPages(PDFTextStripper.java:269)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at org.apache.pdfbox.util.PDFTextStripper.writeText(PDFTextStripper.java:236)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at org.apache.pdfbox.util.PDFTextStripper.getText(PDFTextStripper.java:195)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at com.test.train.PdfManager.ToText(PdfManager.java:49)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at com.test.train.AsyncTraiterPdf.doInBackground(AsyncTraiterPdf.java:64)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at com.test.train.AsyncTraiterPdf.doInBackground(AsyncTraiterPdf.java:1)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at android.os.AsyncTask$2.call(AsyncTask.java:287)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	... 4 more
    08-26 13:12:18.276: E/dalvikvm-heap(1830): Out of memory on a 65034-byte allocation.
    (3) executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, params)
    -> mais étant donné que les exécutions précédentes se font en //, je préfère des exécutions sérialisées, l'une après l'autre, puisque dans les traitements il y aura une màj de la DB avec les data lues dans le PDF
    -> on va donc éviter les problèmes d'accès concurrents
    -> mais malheureusement, toujours débordement mémoire sur la 2ème exécution!
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    08-26 13:18:23.392: E/********************DEBUT(1834): sens 1
    08-26 13:19:04.367: E/>>>******** colonne 2:(1834): 06:01
    08-26 13:19:04.367: E/>>>******** colonne 3:(1834): 06:30
    08-26 13:19:04.367: E/>>>******** colonne 4:(1834): 06:21
    08-26 13:19:04.367: E/>>>******** colonne 5:(1834): 07:01
    08-26 13:19:04.367: E/>>>******** colonne 6:(1834): 07:30
    08-26 13:19:04.367: E/>>>******** colonne 7:(1834): 08:00
    08-26 13:19:04.367: E/>>>******** colonne 8:(1834): 08:30
    08-26 13:19:04.367: E/>>>******** colonne 9:(1834): 08:21
    08-26 13:19:04.367: E/>>>******** colonne 10:(1834): 09:00
    08-26 13:19:04.367: E/>>>******** colonne 11:(1834): 09:30
    08-26 13:19:04.368: E/>>>******** colonne 12:(1834): 09:21
    08-26 13:19:04.368: E/>>>******** colonne 13:(1834): 10:00
    08-26 13:19:04.368: E/>>>******** colonne 14:(1834): 09:62
    08-26 13:19:04.368: E/>>>******** colonne 15:(1834): 11:00
    08-26 13:19:04.368: E/>>>******** colonne 16:(1834): 11:30
    08-26 13:19:04.368: E/>>>******** colonne 17:(1834): 11:21
    08-26 13:19:04.368: E/>>>******** colonne 18:(1834): 12:00
    08-26 13:19:04.368: E/>>>******** colonne 19:(1834): 12:30
    08-26 13:19:04.368: E/>>>******** colonne 20:(1834): 12:19
    08-26 13:19:04.368: E/>>>******** colonne 21:(1834): 13:00
    08-26 13:19:04.368: E/>>>******** colonne 22:(1834): 13:30
    08-26 13:19:04.368: E/>>>******** colonne 23:(1834): 13:21
    08-26 13:19:04.368: E/>>>******** colonne 24:(1834): 14:00
    08-26 13:19:04.368: E/>>>******** colonne 25:(1834): 14:30
    08-26 13:19:04.368: E/>>>******** colonne 26:(1834): 14:21
    08-26 13:19:04.368: E/>>>******** colonne 27:(1834): 15:00
    08-26 13:19:04.369: E/>>>******** colonne 2:(1834): 15:22
    08-26 13:19:04.369: E/>>>******** colonne 3:(1834): 15:30
    08-26 13:19:04.369: E/>>>******** colonne 4:(1834): 16:00
    08-26 13:19:04.369: E/>>>******** colonne 5:(1834): 16:30
    08-26 13:19:04.369: E/>>>******** colonne 6:(1834): 16:21
    08-26 13:19:04.369: E/>>>******** colonne 7:(1834): 16:49
    08-26 13:19:04.370: E/>>>******** colonne 8:(1834): 17:00
    08-26 13:19:04.370: E/>>>******** colonne 9:(1834): 17:30
    08-26 13:19:04.370: E/>>>******** colonne 10:(1834): 17:21
    08-26 13:19:04.370: E/>>>******** colonne 11:(1834): 18:00
    08-26 13:19:04.370: E/>>>******** colonne 12:(1834): 17:49
    08-26 13:19:04.370: E/>>>******** colonne 13:(1834): 18:30
    08-26 13:19:04.370: E/>>>******** colonne 14:(1834): 18:21
    08-26 13:19:04.370: E/>>>******** colonne 15:(1834): 19:00
    08-26 13:19:04.370: E/>>>******** colonne 16:(1834): 19:30
    08-26 13:19:04.370: E/>>>******** colonne 17:(1834): 19:21
    08-26 13:19:04.370: E/>>>******** colonne 18:(1834): 19:59
    08-26 13:19:04.370: E/>>>******** colonne 19:(1834): 20:40
    08-26 13:19:04.371: E/>>>******** colonne 20:(1834): 21:44
    08-26 13:19:04.371: E/>>>******** colonne 21:(1834): 22:29
    08-26 13:19:04.371: E/>>>******** colonne 22:(1834): 23:24
    08-26 13:19:04.371: E/********************FIN(1834): sens 1
    
    08-26 13:19:04.373: E/********************DEBUT(1834): sens 2
    08-26 13:19:33.761: E/dalvikvm-heap(1834): Out of memory on a 65034-byte allocation.
    08-26 13:19:33.776: E/AndroidRuntime(1834): FATAL EXCEPTION: AsyncTask #2
    08-26 13:19:33.776: E/AndroidRuntime(1834): java.lang.RuntimeException: An error occured while executing doInBackground()
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at android.os.AsyncTask$3.done(AsyncTask.java:299)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at java.util.concurrent.FutureTask.run(FutureTask.java:137)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at java.lang.Thread.run(Thread.java:856)
    08-26 13:19:33.776: E/AndroidRuntime(1834): Caused by: java.lang.OutOfMemoryError
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at java.io.ByteArrayOutputStream.toByteArray(ByteArrayOutputStream.java:122)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at org.apache.fontbox.ttf.MemoryTTFDataStream.<init>(MemoryTTFDataStream.java:52)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at org.apache.fontbox.ttf.TTFParser.parse(TTFParser.java:96)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at org.apache.pdfbox.pdmodel.font.PDTrueTypeFont.<init>(PDTrueTypeFont.java:108)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at org.apache.pdfbox.pdmodel.font.PDFontFactory.createFont(PDFontFactory.java:65)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at org.apache.pdfbox.pdmodel.PDResources.getFont(PDResources.java:74)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at org.apache.pdfbox.contentstream.operator.text.SetFontAndSize.process(SetFontAndSize.java:32)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at org.apache.pdfbox.contentstream.PDFStreamEngine.processOperator(PDFStreamEngine.java:809)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at org.apache.pdfbox.contentstream.PDFStreamEngine.processStreamOperators(PDFStreamEngine.java:471)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at org.apache.pdfbox.contentstream.PDFStreamEngine.processStream(PDFStreamEngine.java:445)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at org.apache.pdfbox.contentstream.PDFStreamEngine.processPage(PDFStreamEngine.java:147)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at org.apache.pdfbox.contentstream.PDFTextStreamEngine.processPage(PDFTextStreamEngine.java:102)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at org.apache.pdfbox.util.PDFTextStripper.processPage(PDFTextStripper.java:333)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at org.apache.pdfbox.util.PDFTextStripper.processPages(PDFTextStripper.java:269)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at org.apache.pdfbox.util.PDFTextStripper.writeText(PDFTextStripper.java:236)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at org.apache.pdfbox.util.PDFTextStripper.getText(PDFTextStripper.java:195)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at com.test.train.PdfManager.ToText(PdfManager.java:49)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at com.test.train.AsyncTraiterPdf.doInBackground(AsyncTraiterPdf.java:64)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at com.test.train.AsyncTraiterPdf.doInBackground(AsyncTraiterPdf.java:1)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at android.os.AsyncTask$2.call(AsyncTask.java:287)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	... 5 more

  5. #5
    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
    Le problème ne vient pas des Asynctask mais de tes traitements qui consomme trop de mémoire et/ou ne la libère pas correctement.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 535
    Par défaut
    Ok, alors voici le code

    (mais Java libère pourtant ses ressources lui-même avec le GC, pas besoin de free() après un malloc() comme en C, par exemple )

    AsyncTraiterPdf
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
     
    package com.test.train;
     
    import java.io.IOException;
    import java.util.ArrayList;
     
    import android.app.ProgressDialog;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.util.Log;
     
     
    public class AsyncTraiterPdf extends AsyncTask<Bundle, Void, Void>
    {
    	private static PdfManager pdfManager;
    	private static final String pdfPath = "/storage/sdcard0/download/Train.pdf";
     
     
    	@Override
        protected void onPreExecute() 
    	{
    		super.onPreExecute();
     
    		pdfManager = new PdfManager();  		
    		pdfManager.setFilePath(pdfPath);
            }  
     
    	@Override
    	protected Void doInBackground(Bundle... params) 
    	{
    		int pageDebut=0, pageFin=0, sens=0, indice=0;
    		String arret;
    		String buffer = "";
     
    	        Bundle result = params[0];
    		pageDebut = result.getInt("pageDebut");
    		pageFin = result.getInt("pageFin");
    		sens = result.getInt("sens");
    		arret = result.getString("arret");
     
     
      	 Log.e("********************DEBUT", "sens "+ sens);
     
     	   try 
     	   {
     		   	buffer = pdfManager.ToText(pageDebut, pageFin);   
     	   } 
     	   catch (IOException e1) 
     	   {
    			// TODO Auto-generated catch block
     		   Log.e(">>>********ERREUR fichier PDF ", pdfManager.toString());    
     	   }
     	   String lines[] = buffer.split("\\r?\\n");
     
     
     	   ArrayList<String> linesOK = new ArrayList<String>();
     	   indice = 0;
     	   try
     	   {
    	    	   while (!lines[indice].isEmpty())
    	    	   {
    	    		   if (lines[indice].indexOf(arret) != -1)
    	    		   {
    	    			   linesOK.add(lines[indice]);
    	    		   }
    	    		   indice += 1;
    	    	   }
     	   }
     	   catch (ArrayIndexOutOfBoundsException e)
     	   {
     		   //e.printStackTrace();
     	   }
     
     
     
     	   for(indice = 0; indice <linesOK.size(); indice ++)
     	   {
     		   String cols[] = linesOK.get(indice).toString().split("\\s+");
     		   for(int j= 2; j< cols.length; j++)
     		   {
     			   cols[j] = cols[j].replace('.', ':');
     			   Log.e(">>>******** colonne " +j+": ",cols[j]);     
     
     			   //stockage en base restant à faire!
     		   }
     
     	   }
     
     	  Log.e("********************FIN","sens "+ sens);
     
    		// TODO Auto-generated method stub
    		return null;
    	}
     
     
    	@Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
     
        }
     
        @Override
        protected void onCancelled() {
            super.onCancelled();
        }
     
    }
    PdfManager
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    package com.test.train;
    
    import android.util.Log;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import org.apache.pdfbox.cos.COSDocument;
    import org.apache.pdfbox.pdfparser.PDFParser;
    import org.apache.pdfbox.pdmodel.PDDocument;
    import org.apache.pdfbox.util.PDFTextStripper;
    
    
    public class PdfManager {
        
       private PDFParser parser;
       private PDFTextStripper pdfStripper;
       private PDDocument pdDoc ;
       private COSDocument cosDoc ;
       
       private String Text ;
       private String filePath;
       private File file;
    
       
       public PdfManager() 						{ /* TODO Auto-generated constructor stub */ }
       public void setFilePath(String filePath) { this.filePath = filePath; } 
       
       
       public String ToText(int pageDebut, int pageFin) throws IOException
       {
           this.pdfStripper = null;
           this.pdDoc = null;
           this.cosDoc = null;     
    
           file = new File(filePath);
           parser = new PDFParser(new FileInputStream(file));
    
           parser.parse();      
           cosDoc = parser.getDocument(); 
           pdfStripper = new PDFTextStripper();
           pdDoc = new PDDocument(cosDoc);
           pdDoc.getNumberOfPages();
           pdfStripper.setStartPage(pageDebut);      
           pdfStripper.setEndPage(pageFin);
    
    	Text = pdfStripper.getText(pdDoc);
    
           return Text;
        
       }
       
    }
    PDFTextStripper.getText (librairie PDFBox)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    	public String getText(PDDocument doc) throws IOException
    	{
    		StringWriter outputStream = new StringWriter();
    		writeText(doc, outputStream);
    		return outputStream.toString();
    	}

  7. #7
    Membre Expert
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Par défaut
    Tu crées deux objets AsyncTraiterPdf distinct dans ta méthode update_pdf : tout reste en mémoire.
    OR, dans chacun de ces objets, tu as
    - le PDF manager contenant le PDF
    - le texte complet extrait du PDF
    - toutes les lignes du PDF (ce qui fait doublon avec le texte complet)


    Je te conseille de redécouper tes structures afin de n'avoir :
    - une seule instance de AsyncTraiterPdf
    - découper la méthode doInbackground en plusieurs morceaux : récupération du texte puis récupération des lignes puis analyse (de manière à ne pas garder de références à ce dont tu n'as pas besoin)
    - une seule instance de PdfManager pour tout le monde (si possible, passe le en classe statique pour ne pas garder d'éléments inutiles en mémoire)

  8. #8
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 535
    Par défaut
    Ok, ok... ayant continué à creuser... j'ai trouvé du pétrole ET la solution!

    Donc comme d'habitude, je donne le truc, si qq'un d'autre en avait besoin...

    En fait, le parser alloué par le PdfManager, lui, ne se libère pas tout seul!! Il faut le désallouer de manière explicite!!

    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
    public String ToText(int pageDebut, int pageFin) throws IOException
       {
           this.pdfStripper = null;
           this.pdDoc = null;
           this.cosDoc = null;     
    
           file = new File(filePath);
           parser = new PDFParser(new FileInputStream(file));
    
           parser.parse();      
           cosDoc = parser.getDocument(); 
           pdfStripper = new PDFTextStripper();
           pdDoc = new PDDocument(cosDoc);
           pdDoc.getNumberOfPages();
           pdfStripper.setStartPage(pageDebut);      
           pdfStripper.setEndPage(pageFin);
    
           Text = pdfStripper.getText(pdDoc);
    
           parser.clearResources();
    
           return Text;
        
       }

  9. #9
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 535
    Par défaut
    Bon, j'ai ben parlé trop vite, juste un coup de bol visiblement, le hasard, parce que ça recommence!!
    Y compris après redémarrage du smartphone!!

    Je vais donc suivre la piste de fragmentation proposé par eulbobo.

  10. #10
    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
    Suite à la remarque de eulbobo, ce n'est pas le fait qu'il y ait 2 instances de AsyncTask qui pose problème. En fait tu n'a même pas trop le choix car un objet AsyncTask est à usage unique (eh oui!), c-a-d qu'on ne peut lui invoquer execute() plus d'une fois. Egalement, si ce qui est fait dans doInBracground prend trop de temps, tu obtiens une exception. Donc, pas le choix.
    Ce qui doit être fait en revanche, c'est d’empêcher d'avoir plusieurs instances du PDFManager et consorts, en "singletonisant" tout ce que tu peux et en veillant à libérer toute les ressources. Bref, à optimiser la conso mémoire.

    En ce qui concerne l'histoire des Bundle, il faut bien comprendre que tu te retrouves avec 2 threads (les AsynTasks) qui possèdent la même référence à un unique objet params. Or, tu n'as aucun contrôle sur le déroulement des threads même si le fait d'avoir écris ton code séquentiellement t'en donne le sentiment. Par exemple, pour une raison x ou y, le second AsyncTask instancié peut tout à fait finir *avant* le premier instancié. Bref, le moment où l'objet params est accédé en lecture n'est pas sous ton contrôle. En donnant à chaque AsynTask son propre objet Bundle, on s'évite tous ces risques inutiles.
    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

  11. #11
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 535
    Par défaut
    un objet AsyncTask est à usage unique (eh oui!), c-a-d qu'on ne peut lui invoquer execute() plus d'une fois. Egalement, si ce qui est fait dans doInBracground prend trop de temps, tu obtiens une exception. Donc, pas le choix.
    -> effectivement, je ne savais pas ça!!
    -> comme je l'avais donc déjà évoqué, je dois faire les 2 traitements dans mon AsyncTask!


    Egalement, si ce qui est fait dans doInBracground prend trop de temps, tu obtiens une exception. Donc, pas le choix.
    -> mais comment faire alors, SI les traitements sont trop longs?
    -> sous-traiter les traitements à des thread?
    OU
    -> mieux répartir les traitements entre le doinback & les pre/postExecute?
    Il y a du boulot à faire, alors il faut qd même le faire, quoi!


    Ce qui doit être fait en revanche, c'est d’empêcher d'avoir plusieurs instances du PDFManager et consorts, en "singletonisant" tout ce que tu peux et en veillant à libérer toute les ressources. Bref, à optimiser la conso mémoire.
    -> j'ai déjà commencé à m'occuper de ça, avec des fonctions plus petites, qui libèrent donc leur ressources une fois exécutée!


    En ce qui concerne l'histoire des Bundle, il faut bien comprendre que tu te retrouves avec 2 threads (les AsynTasks) qui possèdent la même référence à un unique objet params. Or, tu n'as aucun contrôle sur le déroulement des threads même si le fait d'avoir écris ton code séquentiellement t'en donne le sentiment. Par exemple, pour une raison x ou y, le second AsyncTask instancié peut tout à fait finir *avant* le premier instancié. Bref, le moment où l'objet params est accédé en lecture n'est pas sous ton contrôle. En donnant à chaque AsynTask son propre objet Bundle, on s'évite tous ces risques inutiles.
    -> effectivement, je raisonne encore trop en "séquentiel", tu as raison


    Bon, je m'y remets, et je vous donne des news demain...

  12. #12
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 535
    Par défaut
    Je te conseille de redécouper tes structures afin de n'avoir :
    - une seule instance de AsyncTraiterPdf
    ok c'est fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public void update_pdf (View view)
    	{
                   new AsyncTraiterPdf().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
     
                   //crash peu importe lequel des 3 appels est utilisé
                   //new AsyncTraiterPdf().executeOnExecutor(AsyncTask.SERIAL_EXECUTOR);
                   //new AsyncTraiterPdf().execute();
            }


    - découper la méthode doInbackground en plusieurs morceaux : récupération du texte puis récupération des lignes puis analyse (de manière à ne pas garder de références à ce dont tu n'as pas besoin)
    ok c'est fait
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    package com.test.train;
     
    import java.io.IOException;
    import java.util.ArrayList;
     
    import android.app.ProgressDialog;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.util.Log;
     
     
    public class AsyncTraiterPdf extends AsyncTask<Bundle, Void, Void>
    {
    	private static PdfManager pdfManager;
    	private static final String pdfPath = "/storage/sdcard0/download/Train.pdf";
     
     
    	private String[] lirePages(int pageDebut, int pageFin)
    	{
    		   String buffer = "";   
     
    	 	   try 
    	 	   {
    	 		   	buffer = pdfManager.ToText(pageDebut, pageFin);   
    	 	   } 
    	 	   catch (IOException e1) 
    	 	   {
    				// TODO Auto-generated catch block
    	 		   Log.e(">>>********ERREUR fichier PDF ", pdfManager.toString());    
    	 		   e1.printStackTrace();
     
    				//afficher un message ("ERREUR fichier non trouvé!") d'info à l'écran!!
    	 	   }
    	 	   return buffer.split("\\r?\\n");
    	}
     
     
            private ArrayList<String> rechercheLignesParArret(String[] lines, String arret)
    	{
    		   ArrayList<String> linesOK = new ArrayList<String>();
    	 	   int indice = 0;
    	 	   try
    	 	   {
    		    	   while (!lines[indice].isEmpty())
    		    	   {
    		    		   if (lines[indice].indexOf(arret) != -1)
    		    		   {
    		    			   linesOK.add(lines[indice]);
    		    		   }
    		    		   indice += 1;
    		    	   }
    	 	   }
    	 	   catch (ArrayIndexOutOfBoundsException e)
    	 	   {
    	 		   //e.printStackTrace();
    	 	   }
    	 	   return linesOK;
    	}
     
     
            private void extractionColonnes(ArrayList<String> linesOK)
    	{
    		for(int indice = 0; indice <linesOK.size(); indice ++)
    		{
    	 		   String cols[] = linesOK.get(indice).toString().split("\\s+");
    	 		   for(int j= 2; j< cols.length; j++)
    	 		   {
    	 			   cols[j] = cols[j].replace('.', ':');
    Log.e(">>>******** colonne " +j+": ",cols[j]);     
     
    	 			   //stockage en base restant à faire
    	 			   //************************
    	 			   //insertHoraire(cols[j]);
    	 		   }
     
    	 	}		
    	}
     
     
    	@Override
        protected void onPreExecute() 
    	{
    		super.onPreExecute();
     
    		pdfManager = new PdfManager();  		
    		pdfManager.setFilePath(pdfPath);
        }
     
     
    	@Override
    	protected Void doInBackground(Bundle... params) 
    	{
    		int pageDebut=0, pageFin=0, sens=0;
    		String arret = "";
     
    		//*******
    		//page n°1
    		//*******
    		pageDebut = 1; pageFin = 1; arret = "Gare"; sens = 1; 
     
    		String lines[] = lirePages(pageDebut, pageFin);
    		ArrayList<String> linesArret = rechercheLignesParArret(lines, arret);
    		extractionColonnes(linesArret);
    Log.e("********************FIN","sens "+ sens);
    Log.e(" "," ");
     
     
    		//*******
    		//page n°3:
    		//*******
    		pageDebut = 3; pageFin = 3; arret = "Centre"; sens = 2; 
     
    		lines = lirePages(pageDebut, pageFin);
    		linesArret = rechercheLignesParArret(lines, arret);
    		extractionColonnes(linesArret);
    Log.e("********************FIN","sens "+ sens);
     
     
    		return null;
    	}
     
     
    	@Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
          }
     
     
        @Override
        protected void onCancelled() {
            super.onCancelled();
        }
     
    }


    - une seule instance de PdfManager pour tout le monde (si possible, passe le en classe statique pour ne pas garder d'éléments inutiles en mémoire)
    ok aussi, puisqu'il ne reste plus qu'une seule instance AsyncTraiterPdf

    MAIS pourtant........
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    08-27 13:26:01.135: E/>>>******** HEURE(3540): (13:26)
    08-27 13:26:03.559: E/********************DEBUT(3540): sens 1
    08-27 13:26:48.146: E/>>>******** colonne 2:(3540): 06:01
    08-27 13:26:48.146: E/>>>******** colonne 3:(3540): 06:30
    08-27 13:26:48.146: E/>>>******** colonne 4:(3540): 06:21
    08-27 13:26:48.146: E/>>>******** colonne 5:(3540): 07:01
    08-27 13:26:48.146: E/>>>******** colonne 6:(3540): 07:30
    08-27 13:26:48.146: E/>>>******** colonne 7:(3540): 08:00
    08-27 13:26:48.146: E/>>>******** colonne 8:(3540): 08:30
    08-27 13:26:48.146: E/>>>******** colonne 9:(3540): 08:21
    08-27 13:26:48.146: E/>>>******** colonne 10:(3540): 09:00
    08-27 13:26:48.146: E/>>>******** colonne 11:(3540): 09:30
    08-27 13:26:48.146: E/>>>******** colonne 12:(3540): 09:21
    08-27 13:26:48.146: E/>>>******** colonne 13:(3540): 10:00
    08-27 13:26:48.146: E/>>>******** colonne 14:(3540): 09:62
    08-27 13:26:48.146: E/>>>******** colonne 15:(3540): 11:00
    08-27 13:26:48.146: E/>>>******** colonne 16:(3540): 11:30
    08-27 13:26:48.146: E/>>>******** colonne 17:(3540): 11:21
    08-27 13:26:48.146: E/>>>******** colonne 18:(3540): 12:00
    08-27 13:26:48.147: E/>>>******** colonne 19:(3540): 12:30
    08-27 13:26:48.147: E/>>>******** colonne 20:(3540): 12:19
    08-27 13:26:48.147: E/>>>******** colonne 21:(3540): 13:00
    08-27 13:26:48.147: E/>>>******** colonne 22:(3540): 13:30
    08-27 13:26:48.147: E/>>>******** colonne 23:(3540): 13:21
    08-27 13:26:48.147: E/>>>******** colonne 24:(3540): 14:00
    08-27 13:26:48.147: E/>>>******** colonne 25:(3540): 14:30
    08-27 13:26:48.147: E/>>>******** colonne 26:(3540): 14:21
    08-27 13:26:48.147: E/>>>******** colonne 27:(3540): 15:00
    08-27 13:26:48.148: E/>>>******** colonne 2:(3540): 15:22
    08-27 13:26:48.148: E/>>>******** colonne 3:(3540): 15:30
    08-27 13:26:48.148: E/>>>******** colonne 4:(3540): 16:00
    08-27 13:26:48.148: E/>>>******** colonne 5:(3540): 16:30
    08-27 13:26:48.148: E/>>>******** colonne 6:(3540): 16:21
    08-27 13:26:48.148: E/>>>******** colonne 7:(3540): 16:49
    08-27 13:26:48.148: E/>>>******** colonne 8:(3540): 17:00
    08-27 13:26:48.148: E/>>>******** colonne 9:(3540): 17:30
    08-27 13:26:48.148: E/>>>******** colonne 10:(3540): 17:21
    08-27 13:26:48.148: E/>>>******** colonne 11:(3540): 18:00
    08-27 13:26:48.149: E/>>>******** colonne 12:(3540): 17:49
    08-27 13:26:48.149: E/>>>******** colonne 13:(3540): 18:30
    08-27 13:26:48.149: E/>>>******** colonne 14:(3540): 18:21
    08-27 13:26:48.149: E/>>>******** colonne 15:(3540): 19:00
    08-27 13:26:48.149: E/>>>******** colonne 16:(3540): 19:30
    08-27 13:26:48.149: E/>>>******** colonne 17:(3540): 19:21
    08-27 13:26:48.149: E/>>>******** colonne 18:(3540): 19:59
    08-27 13:26:48.149: E/>>>******** colonne 19:(3540): 20:40
    08-27 13:26:48.149: E/>>>******** colonne 20:(3540): 21:44
    08-27 13:26:48.149: E/>>>******** colonne 21:(3540): 22:29
    08-27 13:26:48.149: E/>>>******** colonne 22:(3540): 23:24
    08-27 13:26:48.152: E/********************FIN(3540): sens 1
    08-27 13:26:48.152: E/(3540):  
    08-27 13:26:48.152: E/********************DEBUT(3540): sens 2
    08-27 13:27:17.195: E/dalvikvm-heap(3540): Out of memory on a 16400-byte allocation.
    08-27 13:27:17.234: E/AndroidRuntime(3540): FATAL EXCEPTION: AsyncTask #1
    08-27 13:27:17.234: E/AndroidRuntime(3540): java.lang.RuntimeException: An error occured while executing doInBackground()
    08-27 13:27:17.234: E/AndroidRuntime(3540): 	at android.os.AsyncTask$3.done(AsyncTask.java:299)
    08-27 13:27:17.234: E/AndroidRuntime(3540): 	at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
    08-27 13:27:17.234: E/AndroidRuntime(3540): 	at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
    08-27 13:27:17.234: E/AndroidRuntime(3540): 	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
    08-27 13:27:17.234: E/AndroidRuntime(3540): 	at java.util.concurrent.FutureTask.run(FutureTask.java:137)
    08-27 13:27:17.234: E/AndroidRuntime(3540): 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
    08-27 13:27:17.234: E/AndroidRuntime(3540): 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
    08-27 13:27:17.234: E/AndroidRuntime(3540): 	at java.lang.Thread.run(Thread.java:856)
    08-27 13:27:17.234: E/AndroidRuntime(3540): Caused by: java.lang.OutOfMemoryError
    08-27 13:27:17.234: E/AndroidRuntime(3540): 	at java.io.BufferedInputStream.<init>(BufferedInputStream.java:96)
    08-27 13:27:17.234: E/AndroidRuntime(3540): 	at org.apache.pdfbox.cos.COSStream.getUnfilteredStream(COSStream.java:238)
    08-27 13:27:17.234: E/AndroidRuntime(3540): 	at org.apache.pdfbox.pdmodel.common.PDStream.createInputStream(PDStream.java:215)
    08-27 13:27:17.234: E/AndroidRuntime(3540): 	at org.apache.pdfbox.pdmodel.font.PDTrueTypeFont.<init>(PDTrueTypeFont.java:108)
    08-27 13:27:17.234: E/AndroidRuntime(3540): 	at org.apache.pdfbox.pdmodel.font.PDFontFactory.createFont(PDFontFactory.java:65)
    08-27 13:27:17.234: E/AndroidRuntime(3540): 	at org.apache.pdfbox.pdmodel.PDResources.getFont(PDResources.java:74)
    08-27 13:27:17.234: E/AndroidRuntime(3540): 	at org.apache.pdfbox.contentstream.operator.text.SetFontAndSize.process(SetFontAndSize.java:32)
    08-27 13:27:17.234: E/AndroidRuntime(3540): 	at org.apache.pdfbox.contentstream.PDFStreamEngine.processOperator(PDFStreamEngine.java:809)
    08-27 13:27:17.234: E/AndroidRuntime(3540): 	at org.apache.pdfbox.contentstream.PDFStreamEngine.processStreamOperators(PDFStreamEngine.java:471)
    08-27 13:27:17.234: E/AndroidRuntime(3540): 	at org.apache.pdfbox.contentstream.PDFStreamEngine.processStream(PDFStreamEngine.java:445)
    08-27 13:27:17.234: E/AndroidRuntime(3540): 	at org.apache.pdfbox.contentstream.PDFStreamEngine.processPage(PDFStreamEngine.java:147)
    08-27 13:27:17.234: E/AndroidRuntime(3540): 	at org.apache.pdfbox.contentstream.PDFTextStreamEngine.processPage(PDFTextStreamEngine.java:102)
    08-27 13:27:17.234: E/AndroidRuntime(3540): 	at org.apache.pdfbox.util.PDFTextStripper.processPage(PDFTextStripper.java:333)
    08-27 13:27:17.234: E/AndroidRuntime(3540): 	at org.apache.pdfbox.util.PDFTextStripper.processPages(PDFTextStripper.java:269)
    08-27 13:27:17.234: E/AndroidRuntime(3540): 	at org.apache.pdfbox.util.PDFTextStripper.writeText(PDFTextStripper.java:236)
    08-27 13:27:17.234: E/AndroidRuntime(3540): 	at org.apache.pdfbox.util.PDFTextStripper.getText(PDFTextStripper.java:195)
    08-27 13:27:17.234: E/AndroidRuntime(3540): 	at com.test.train.PdfManager.ToText(PdfManager.java:49)
    08-27 13:27:17.234: E/AndroidRuntime(3540): 	at com.test.train.AsyncTraiterPdf.lirePages(AsyncTraiterPdf.java:35)
    08-27 13:27:17.234: E/AndroidRuntime(3540): 	at com.test.train.AsyncTraiterPdf.doInBackground(AsyncTraiterPdf.java:157)
    08-27 13:27:17.234: E/AndroidRuntime(3540): 	at com.test.train.AsyncTraiterPdf.doInBackground(AsyncTraiterPdf.java:1)
    08-27 13:27:17.234: E/AndroidRuntime(3540): 	at android.os.AsyncTask$2.call(AsyncTask.java:287)
    08-27 13:27:17.234: E/AndroidRuntime(3540): 	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
    08-27 13:27:17.234: E/AndroidRuntime(3540): 	... 4 more

  13. #13
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 535
    Par défaut
    J'ai même repris aussi la classe PdfManager trouvée dans un exemple en ligne, pour l'optimiser aussi!
    -> avant le constructeur ne faisait rien
    -> maintenant il fait l'init du PDF: inutile de le faire à chaque appel de la fonction ToText(), puisque c'est le même fichier
    -> et celle-ci se contente maintenant de modifier les pages à lire, avant la lecture

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    package com.test.train;
    
    import android.util.Log;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import org.apache.pdfbox.cos.COSDocument;
    import org.apache.pdfbox.pdfparser.PDFParser;
    import org.apache.pdfbox.pdmodel.PDDocument;
    import org.apache.pdfbox.util.PDFTextStripper;
    
    
    public class PdfManager {
       
       private PDFParser parser;
       private PDFTextStripper pdfStripper;
       private PDDocument pdDoc ;
       private COSDocument cosDoc ;
       private File file;
    
       public PdfManager(String filePath) throws IOException 						
       { 
           //toute cette partie se trouvait avant dans la fonction ToText()... débile!
           file = new File(filePath);
           parser = new PDFParser(new FileInputStream(file));
           parser.parse();      
           cosDoc = parser.getDocument(); 
           pdfStripper = new PDFTextStripper();
           pdDoc = new PDDocument(cosDoc);
           pdDoc.getNumberOfPages();
       }
       
       public String ToText(int pageDebut, int pageFin) throws IOException
       {
           //la fonction est maintenant épurée et ne fait plus que changer les pages, avant d'en lire le contenu
           pdfStripper.setStartPage(pageDebut);      
           pdfStripper.setEndPage(pageFin);
           String Text = pdfStripper.getText(pdDoc);
    
           return Text;
       }
       
    }
    Malheureusement, sans plus de succès/incidence sur le problème de mémoire... toujours le getText() qui plante.........

  14. #14
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 535
    Par défaut
    Ça semble vraiment insoluble, parce que j'ai vraiment l'impression que le leak mémoire vient de la librairie PDFBox (getText()), finalement!
    Coté Java pur, je ne vois pas comment je pourrai optimiser plus.........

    Donc, si une lecture multiple pose problème, je vais donc changer mon fusil d'épaule et récupérer dans mon buffer toutes les pages du PDF en une seule lecture, et faire une analyse syntaxique pour retrouver mes data utiles, pages par pages!

  15. #15
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 535
    Par défaut
    Ok, mon analyse syntaxique Java fonctionne.
    à vous.

    Juste encore un problème résiduel PDFBox:
    -> le colonnes horaires vides
    -> soit pas exportées du tout
    -> soit exportées comme <space>, mais dans ce cas, impossible de différencier une colonne vide d'un vrai <space> du fichier

    Mais là, vous n'aurez probablement pas la réponse.

    Je laisse encore le topic ouvert 1 ou 2 jours, si jamais, et sinon je le fermerai.

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

Discussions similaires

  1. Un vrai problème de son..
    Par polevka dans le forum Windows Vista
    Réponses: 1
    Dernier message: 19/12/2007, 20h13
  2. Problème et questions sur un calcul de distance
    Par ale2000 dans le forum Traitement d'images
    Réponses: 7
    Dernier message: 11/09/2007, 20h33
  3. Sessions, variables, problèmes et questions
    Par gloubi dans le forum Langage
    Réponses: 2
    Dernier message: 24/02/2007, 10h46
  4. Problème jCombobox : Question métaphysique.
    Par catwomanette dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 16/01/2007, 10h47
  5. Firbird / IB Expert / MySQL : problèmes et questions
    Par DragOr dans le forum Bases de données
    Réponses: 1
    Dernier message: 24/12/2006, 11h56

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