Autore Topic: Allocare memoria alla propria App  (Letto 701 volte)

Offline dom4

  • Utente normale
  • ***
  • Post: 158
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Vodafone Ideos, Nexus 5
Allocare memoria alla propria App
« il: 15 Maggio 2012, 12:37:27 CEST »
0
Salve ragazzi, ho letto un pò in giro che Android 2.3 alloca 16 MB per ogni applicazione, limite che dovrebbe aumentare dalle versione successive,dalla 3.0 in poi.Ora sto effettuando delle chiamate ad un WS,e noto che entrando nell'applicazione non vengono subito allocati i 16 Mb ma vengono allocati man mano durante la sincronizzazione,però ogni allocazione mi fa allungare i tempi di sincronizzazione,quindi volevo sapere se ci fosse un modo per allocare direttamente i 16 Mb.

Grazie in anticipo per le risposte.

Offline droid7

  • Nuovo arrivato
  • *
  • Post: 44
  • Respect: +4
    • droidrcc
    • Mostra profilo
    • echlabSoftware
  • Dispositivo Android:
    Lg Optimus One
  • Play Store ID:
    echlab software
  • Sistema operativo:
    Archlinux
Re:Allocare memoria alla propria App
« Risposta #1 il: 15 Maggio 2012, 12:47:08 CEST »
0
Ciao dom4, giustamente come dici la memoria viene allocata dinamicamente, ma non mi è chiaro il tuo problema... Come effettui le chiamate al web service? come fai a dire che si allungano i tempi di sincronizzazione ad ogni chiamata?
Android applications: echlabSoftware

Offline dom4

  • Utente normale
  • ***
  • Post: 158
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Vodafone Ideos, Nexus 5
Re:Allocare memoria alla propria App
« Risposta #2 il: 15 Maggio 2012, 12:53:10 CEST »
0
Ciao dom4, giustamente come dici la memoria viene allocata dinamicamente, ma non mi è chiaro il tuo problema... Come effettui le chiamate al web service? come fai a dire che si allungano i tempi di sincronizzazione ad ogni chiamata?
Grazie per la risposta.
Le chiamate le effettuo mediante Ksoap, me ne accorgo guardando il log.
Vedi tutti quei paused,mi fanno perdere tempo, perciò vorrei, se fosse possibile, che la memoria venisse settata direttamente a 16 Mb, così non avrei perdite di tempo.

Codice: [Seleziona]
05-15 10:18:14.772: D/dalvikvm(829): GC_CONCURRENT freed 7699K, 40% free 11765K/19591K, paused 10ms+30ms
05-15 10:18:16.925: D/dalvikvm(829): GC_FOR_ALLOC freed 836K, 41% free 11682K/19591K, paused 143ms
05-15 10:18:17.093: D/dalvikvm(829): GC_FOR_ALLOC freed 0K, 40% free 11827K/19591K, paused 144ms
05-15 10:18:17.093: I/dalvikvm-heap(829): Grow heap (frag case) to 11.887MB for 296280-byte allocation
05-15 10:18:17.284: D/dalvikvm(829): GC_FOR_ALLOC freed 0K, 40% free 12116K/19911K, paused 167ms
05-15 10:18:17.284: I/dalvikvm-heap(829): Grow heap (frag case) to 12.029MB for 148148-byte allocation
05-15 10:18:17.476: D/dalvikvm(829): GC_FOR_ALLOC freed 289K, 41% free 11971K/20103K, paused 161ms
05-15 10:18:17.637: D/dalvikvm(829): GC_FOR_ALLOC freed 0K, 41% free 11971K/20103K, paused 144ms
05-15 10:18:17.643: I/dalvikvm-heap(829): Grow heap (frag case) to 12.311MB for 592544-byte allocation
05-15 10:18:17.836: D/dalvikvm(829): GC_FOR_ALLOC freed 0K, 40% free 12550K/20743K, paused 172ms
05-15 10:18:17.843: I/dalvikvm-heap(829): Grow heap (frag case) to 12.593MB for 296280-byte allocation
05-15 10:18:18.022: D/dalvikvm(829): GC_FOR_ALLOC freed 289K, 41% free 12550K/21063K, paused 150ms
05-15 10:18:20.532: D/dalvikvm(829): GC_CONCURRENT freed 1364K, 38% free 13143K/21063K, paused 25ms+12ms
05-15 10:18:23.134: D/dalvikvm(829): GC_CONCURRENT freed 1102K, 34% free 13995K/21063K, paused 22ms+13ms
05-15 10:18:34.782: D/dalvikvm(829): GC_CONCURRENT freed 1975K, 34% free 13942K/21063K, paused 24ms+5ms
05-15 10:18:53.822: D/dalvikvm(829): GC_CONCURRENT freed 4620K, 47% free 11301K/21063K, paused 9ms+11ms
05-15 10:18:55.034: D/dalvikvm(829): GC_CONCURRENT freed 850K, 43% free 12012K/21063K, paused 15ms+12ms
05-15 10:19:06.802: D/dalvikvm(829): GC_CONCURRENT freed 1591K, 43% free 12203K/21063K, paused 23ms+6ms
05-15 10:19:10.352: D/dalvikvm(829): GC_CONCURRENT freed 1267K, 40% free 12812K/21063K, paused 30ms+12ms
05-15 10:19:40.162: D/dalvikvm(829): GC_CONCURRENT freed 2715K, 43% free 12134K/21063K, paused 26ms+11ms
05-15 10:19:41.874: D/dalvikvm(829): GC_CONCURRENT freed 1042K, 39% free 12928K/21063K, paused 10ms+15ms
05-15 10:19:56.502: D/dalvikvm(829): GC_CONCURRENT freed 2599K, 42% free 12357K/21063K, paused 8ms+81ms
05-15 10:19:58.527: D/dalvikvm(829): GC_CONCURRENT freed 1194K, 38% free 13092K/21063K, paused 30ms+13ms
05-15 10:20:11.592: D/dalvikvm(829): GC_CONCURRENT freed 2521K, 41% free 12549K/21063K, paused 10ms+5ms
05-15 10:20:14.462: D/dalvikvm(829): GC_CONCURRENT freed 2262K, 43% free 12207K/21063K, paused 35ms+6ms
05-15 10:20:25.822: D/dalvikvm(829): GC_CONCURRENT freed 1597K, 41% free 12480K/21063K, paused 15ms+23ms
05-15 10:20:30.322: D/dalvikvm(829): GC_CONCURRENT freed 2190K, 43% free 12211K/21063K, paused 24ms+10ms
05-15 10:20:40.662: D/dalvikvm(829): GC_CONCURRENT freed 1507K, 41% free 12557K/21063K, paused 9ms+11ms
05-15 10:20:48.832: D/dalvikvm(829): GC_CONCURRENT freed 2269K, 43% free 12210K/21063K, paused 20ms+5ms
05-15 10:20:57.643: D/dalvikvm(829): GC_CONCURRENT freed 1438K, 40% free 12644K/21063K, paused 22ms+98ms
05-15 10:21:08.352: D/dalvikvm(829): GC_CONCURRENT freed 2354K, 43% free 12212K/21063K, paused 15ms+10ms
05-15 10:21:13.453: D/dalvikvm(829): GC_CONCURRENT freed 1362K, 40% free 12733K/21063K, paused 28ms+13ms
05-15 10:21:25.822: D/dalvikvm(829): GC_CONCURRENT freed 2447K, 43% free 12208K/21063K, paused 26ms+5ms
05-15 10:21:28.633: D/dalvikvm(829): GC_CONCURRENT freed 1258K, 40% free 12830K/21063K, paused 9ms+13ms
05-15 10:21:40.952: D/dalvikvm(829): GC_CONCURRENT freed 2677K, 43% free 12136K/21063K, paused 10ms+7ms
05-15 10:21:42.882: D/dalvikvm(829): GC_CONCURRENT freed 1045K, 39% free 12931K/21063K, paused 21ms+15ms
05-15 10:21:54.742: D/dalvikvm(829): GC_CONCURRENT freed 2602K, 42% free 12361K/21063K, paused 31ms+28ms
05-15 10:21:56.756: D/dalvikvm(829): GC_CONCURRENT freed 1189K, 38% free 13097K/21063K, paused 14ms+12ms
05-15 10:22:09.742: D/dalvikvm(829): GC_CONCURRENT freed 2501K, 41% free 12576K/21063K, paused 15ms+15ms
05-15 10:22:18.493: D/dalvikvm(829): GC_CONCURRENT freed 2474K, 43% free 12026K/21063K, paused 38ms+6ms

Offline droid7

  • Nuovo arrivato
  • *
  • Post: 44
  • Respect: +4
    • droidrcc
    • Mostra profilo
    • echlabSoftware
  • Dispositivo Android:
    Lg Optimus One
  • Play Store ID:
    echlab software
  • Sistema operativo:
    Archlinux
Re:Allocare memoria alla propria App
« Risposta #3 il: 15 Maggio 2012, 14:00:36 CEST »
0
che struttura dati utlizzi come contenitore per la risposta ? Allega un pò di codice relativo a richiesta/risposta... Non dovrebbe essere necessario allocare direttamente una struttura dati da 16Mb, inutilmente.
Android applications: echlabSoftware

Offline dom4

  • Utente normale
  • ***
  • Post: 158
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Vodafone Ideos, Nexus 5
Re:Allocare memoria alla propria App
« Risposta #4 il: 15 Maggio 2012, 17:32:44 CEST »
0
che struttura dati utlizzi come contenitore per la risposta ? Allega un pò di codice relativo a richiesta/risposta... Non dovrebbe essere necessario allocare direttamente una struttura dati da 16Mb, inutilmente.

Uso la libreria Ksoap,in quanto il ws può essere invocato solo tramite chiamata Soap,posto un esempio di richiesta e parsing della risposta:
Codice (Java): [Seleziona]
   public void downloadListaMarche(CredenzialiAccesso credacc)
   {
//              Log.i("","download marca componente");
   
           try {
                        METHOD_NAME = "GetListaMarche";
                        SOAP_ACTION = NAMESPACE.concat(METHOD_NAME);
                   
           //Chiamo il Metodo del WebServer
           SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
           request.addProperty("login", credacc.getLogin());
           request.addProperty("password", credacc.getPassword());
           request.addProperty("deviceId", credacc.getDeviceId());
         
//           Log.i("addProperty","alla request" + request.getPropertyCount());
           
              SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
              envelope.bodyOut = request;
              envelope.dotNet = true;
              envelope.setOutputSoapObject(request);
              envelope.setAddAdornments(false);
              envelope.implicitTypes= true;
//              Log.i("Envelope","settata");
       
              HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
              androidHttpTransport.debug = true;
              androidHttpTransport.call(SOAP_ACTION, envelope);
//              Log.i("","" + androidHttpTransport.requestDump);
//              Log.i("","" + androidHttpTransport.responseDump);
//              Log.i("call","call");
           
             SoapObject resultsRequestSOAP = (SoapObject) envelope.getResponse();
//             Log.i("SoapObject","Result" + resultsRequestSOAP);
//             Log.i("GetAttribute","Count" + resultsRequestSOAP.getPropertyCount());

             inserisciMarcaComponente(db, resultsRequestSOAP);
     
         }catch(Exception e)
           {
         
           }
   }
 private void inserisciMarcaComponente(DataBaseTTS db, SoapObject soap){
                int num_marcacomponente = soap.getPropertyCount();
                ContentValues values = new ContentValues();
//              Log.i("","Inserisco marca componente");
//              Log.i("", "num_marcacomponente "+num_marcacomponente);
                try{
                        for(int i=0; i<num_marcacomponente;i++){
//                              Log.i("", "sono nel try di inserisciMarcaComponente");
//                              Log.i("", "Dim value " +values.size());
                                SoapObject pi = (SoapObject) soap.getProperty(i);
                                values.put("Id",  pi.getProperty(0).toString());
//                              Log.i("", "L'id è "+pi.getProperty(0).toString());
                                values.put("CodeBusiness", pi.getProperty(1).toString());
//                              Log.i("", "Il code  è "+pi.getProperty(1).toString());
                                values.put("Name", pi.getProperty(2).toString());
//                              Log.i("", "Name è "+pi.getProperty(2).toString());
                                values.put("Description", pi.getProperty(3).toString());
//                              Log.i("", "Desc è "+pi.getProperty(3).toString());
                                values.put("Enabled", pi.getProperty(4).toString());
//                              Log.i("", "Enab è "+pi.getProperty(4).toString());
                                values.put("Link", pi.getProperty(5).toString());
//                              Log.i("", "Il link è "+pi.getProperty(5).toString());
                                values.put("Image", pi.getProperty(6).toString());
//                              Log.i("", "Image è "+pi.getProperty(6).toString());
//                              values.put("Image", "manuale");
//                              Log.i("", "Image è manuale");
//                              Log.i("", "Dim value " +values.size());
                                long a = db.insert("marcacomponente", null, values);
//                              Log.i("", "inserimento: " +a);
//                              Log.i("", "Dim value " +values.size());
                        }
                        }catch (Exception e) {
                                Log.i("", "Errore: "+e.getMessage());
                        }
      }
   
   
Immaginati questo tipo di chiamata replicato una ventina di volte.Di per sè tutta l'operazione viene compiuta in 4/5 minuti, vorrei scendere a 3,e credo che le pause per l'allocazione possano farmi risparmiare altro tempo.
I 16 megabyte mi servono tutti,perchè dopo faccio una serie di scritture e letture nel database,che tra l'altro mi mandano in crash l'app,quando manca il 25% di spazio libero per l'app.

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
« Ultima modifica: 15 Maggio 2012, 18:05:17 CEST da Ricky` »

Offline dom4

  • Utente normale
  • ***
  • Post: 158
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Vodafone Ideos, Nexus 5

Offline dom4

  • Utente normale
  • ***
  • Post: 158
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Vodafone Ideos, Nexus 5
Re:Allocare memoria alla propria App
« Risposta #7 il: 16 Maggio 2012, 18:55:06 CEST »
0
Ho provato ad effettuare l'inserimento con il metodo suggeritomi da Ricky,personalmente non ho trovato grandi vantaggi ad utilizzare quel metodo,il problema rimane il tempo perso per allocare la memoria..

Offline dom4

  • Utente normale
  • ***
  • Post: 158
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Vodafone Ideos, Nexus 5
Re:Allocare memoria alla propria App
« Risposta #8 il: 18 Maggio 2012, 08:42:43 CEST »
0
Ho provato ad effettuare l'inserimento con il metodo suggeritomi da Ricky,personalmente non ho trovato grandi vantaggi ad utilizzare quel metodo,il problema rimane il tempo perso per allocare la memoria..

Devo rettificare quanto detto in precedenza,non avevo letto bene il commento suggeritomi da Ricky,è mostruoso,ora faccio la sincronizzazione in meno di un minuto prima ne impiegavo sei,i tre comandi legati alle performance del db lo rendono velocissimo,sono rimasto impressionato.Grazie Ricky..

Offline CoN

  • Nuovo arrivato
  • *
  • Post: 31
  • Respect: 0
    • Mostra profilo
Re:Allocare memoria alla propria App
« Risposta #9 il: 21 Maggio 2012, 09:36:19 CEST »
0
Ciao a tutti, ho seguito anke io il suggerimento ed ho notato grandi miglioramenti, il mio problema sta nell'uso del metodo replace, dalla documentazione ho letto che replica le righe uguali sostituendole con quelle appena inserite, nel mio caso però cambio un solo campo della riga mentre tutti gli altri restano uguali, questo mi replica la riga e nn la sostituisce. E' possibile aggiornare una riga con il metodo replace??
Grazie in anticipo