Autore Topic: Parsing lunghetto...  (Letto 674 volte)

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Parsing lunghetto...
« il: 16 Agosto 2011, 17:39:50 CEST »
0
Ho sviluppato un service per la mia app che fa un download di alcune informazioni di "lookup".
Ho sempre provato su emulatore e tutto funzionava senza grossi problemi, ma oggi ho testato su telefono...
Una delle tabelle di lookup è formata da qualcosa come 9136 record, tutti in formato json...
l'emulatore fa le operazioni in 1-2 minuti, ma il telefono è qui da 7 minuti ed è a meno di metà... ora la mia domanda è,come velocizzare il tutto?
mi faccio uno script SQL della tabella di lookup? (che menata).
mi faccio una versione del db in assets e me la copio li?
il problema è che questa tabella di lookup può cambiare, quindi o faccio cambiare tutto lato server, o trovo una soluzione... voi avete idee?
il problema piu grosso è che l'app è per "infermieri" quindi far aspettare 15 minuti per dei dati di lookup mi pare eccessivo (è anche vero che vengono scaricati una tantum)...

qualsiasi idea è ben accetta!
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline Giovanni D'Addabbo

  • Utente normale
  • ***
  • Post: 163
  • Respect: +8
    • Google+
    • giovannid
    • giovanni.daddabbo
    • magoscuro
    • Mostra profilo
    • Rhubbit.it - Sviluppo app Android/iOs
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Rhubbit srl
  • Sistema operativo:
    Windows/Mac/Linux
Re:Parsing lunghetto...
« Risposta #1 il: 16 Agosto 2011, 18:01:24 CEST »
0
e se usassi i thread e suddividessi tutto il carico di lavoro in diversi thread sfruttando il multithreading di android?
Cmq 9000 record non son tantissimi...io ottimizzerei tutto lato server cmq

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Parsing lunghetto...
« Risposta #2 il: 16 Agosto 2011, 20:34:19 CEST »
0
e se usassi i thread e suddividessi tutto il carico di lavoro in diversi thread sfruttando il multithreading di android?

Tanto se il telefono è singlecore viene comunque elaborato un thread alla volta quindi non ottieni benefici.

Comunque Nico io non ho capito molto bene cosa intendi... qual'è il collo di bottiglia?

Offline teskio

  • Moderatore globale
  • Utente normale
  • *****
  • Post: 387
  • Respect: +118
    • Github
    • Google+
    • Mostra profilo
    • Skullab
  • Dispositivo Android:
    Cubot GT99 / SurfTab Ventos 10.1
  • Play Store ID:
    Skullab Software
  • Sistema operativo:
    windows 7 / ubuntu 12.04
Re:Parsing lunghetto...
« Risposta #3 il: 16 Agosto 2011, 21:39:27 CEST »
0
Dove memorizzi i dati di lookup, in un DB del device ? O usi una cosa tipo Array/Vettori/HashMap/HashTable ?

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Parsing lunghetto...
« Risposta #4 il: 16 Agosto 2011, 22:20:35 CEST »
0
Tanto se il telefono è singlecore viene comunque elaborato un thread alla volta quindi non ottieni benefici.

Comunque Nico io non ho capito molto bene cosa intendi... qual'è il collo di bottiglia?
allora, ho 6 links in cui ho 6 json diversi:
-Trattamenti
-Distretti
-Municipalità
-Diari
-TipiDiario
-Unità Organizzative

Tutti i parsing, eccetto municipalità vengono eseguiti velocissimamente.
Tutti i link sono formati da un json con dentro un'array di elementi, in cui ogni elemento è fatto da ID e Descrizione.

Scaricando da browser il file Municipalità.json ho circa 800kb di roba.
Il download viene fatto molto velocemente, ho usato debug e i vari systemout per la verifica.
Le municipalità invece vengono fatte molto piu lentamente, cioè io ho messo nel ciclo for un system out ad ogni iterazione e vedo andare avanti la cosa moolto lentamente.
In pratica ho una funzione:
db.add(new Municipality)
New municipality in realtà si ottiene tramite il metodo static Municipality.parseMunicipality(JSONObject).
ecco, li ho il collo di bottiglia.
i dati, sono come avrete capito in un db nel telefono...
la cosa che mi turba è che sull'emulatore (sempre 2.3.4) ci mette tipo 20 secondi, sul nexus s (formattato e pulito) 15 minuti... c'è qualcosa che non va, appunto, 9000 record non sono poi cosi tanti!
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Parsing lunghetto...
« Risposta #5 il: 16 Agosto 2011, 22:34:11 CEST »
0
New municipality in realtà si ottiene tramite il metodo static Municipality.parseMunicipality(JSONObject).
ecco, li ho il collo di bottiglia.

Beh andare a fare 9000 new e 9000 add (che poi è una add di un ArrayList?) di per se è abbastanza oneroso... bisognerebbe trovare qualche ottimizzazione anche per quello...

Citazione
la cosa che mi turba è che sull'emulatore (sempre 2.3.4) ci mette tipo 20 secondi, sul nexus s (formattato e pulito) 15 minuti... c'è qualcosa che non va, appunto, 9000 record non sono poi cosi tanti!

Non è che sul telefono hai dei processi che ti tengono occupata buona parte della cpu facendo abbassare la priorità di quello della tu app?

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Parsing lunghetto...
« Risposta #6 il: 16 Agosto 2011, 22:39:24 CEST »
0
Beh andare a fare 9000 new e 9000 add (che poi è una add di un ArrayList?) di per se è abbastanza oneroso... bisognerebbe trovare qualche ottimizzazione anche per quello...

Non è che sul telefono hai dei processi che ti tengono occupata buona parte della cpu facendo abbassare la priorità di quello della tu app?
oddio, ho fatto l'oem unlock 5 minuti prima di provare l'app,quindi il tel era pulito, ho tolto anche le varie sync automatiche ecc...
boh, le alternative che voglio provare domani è:
1-Creare un'arrayList di Municipalities e solo dopo averli parsati fare il write su db (cosi vedo cosa dei due è piu oneroso)
2-se è il parsing la parte piu onerosa (anche se dubito) allora taglio le new e richiamo la write su DB direttamente dandogli writeDB(id,descrizione)

se anche cosi è troppo lento boh, sbatto la testa contro i muri :D

ah dimenticavo, il tutto è in un service, in un thread separato
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Parsing lunghetto...
« Risposta #7 il: 16 Agosto 2011, 22:43:10 CEST »
0
Prova con questo tool a vedere un po' se riesci a capire cosa è lento:

Profiling with Traceview and dmtracedump | Android Developers

Comunque non ti consiglio di passare per l'ArrayList, è oneroso crearla, passa direttamente alla scrittura su db utilizzando ovviamente dei PreparedStatement.

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Parsing lunghetto...
« Risposta #8 il: 16 Agosto 2011, 22:46:36 CEST »
0
Prova con questo tool a vedere un po' se riesci a capire cosa è lento:

Profiling with Traceview and dmtracedump | Android Developers

Comunque non ti consiglio di passare per l'ArrayList, è oneroso crearla, passa direttamente alla scrittura su db utilizzando ovviamente dei PreparedStatement.
mmm che bella menata... non mi ricordo mai come funzionano i prepared statement... io ho sempre usato i content values...

Codice (Java): [Seleziona]
        public void insertMunicipality(Municipality municipality) {
                ContentValues cv = new ContentValues();
                cv.put(LookUPTables.MunicipalitiesMD.ID, municipality.getId());
                cv.put(LookUPTables.MunicipalitiesMD.DESCRIPTION_KEY, municipality.getDescription());
                mDb.insertWithOnConflict(LookUPTables.MunicipalitiesMD.MUNICIPALITIES_TABLE, null, cv, SQLiteDatabase.CONFLICT_REPLACE);
        }

la mia scrittura è cosi... e credo sia poco ottimizzata...
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Parsing lunghetto...
« Risposta #10 il: 16 Agosto 2011, 22:55:27 CEST »
0
Dai un occhio qui:

Out Of What Box? » Android: Using DatabaseUtils.InsertHelper for faster insertions into SQLite database
moolto utile,stasera non ho tanta voglia, ma domani me lo provo per bene, se posso evitare il tracing (che significa 15 minuti persi col telefono per provare l'app) è meglio...
grazie mille rick!
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Parsing lunghetto...
« Risposta #11 il: 17 Agosto 2011, 12:39:09 CEST »
0
grazie all'ultimo link di ricky ho risolto.
Avevo provato a dividere parsing e scrittura su db in due fasi, il parsing ci metteva tipo 1 secondo,la scrittura su db tantissimo.
allora ho usato il metodo nel post ma ancora non era super veloce... poi tra i commenti ho trovato uno che consiglia di mettere tutto sotto transaction unica... beh, risultato? da 15 minuti totali ci metto 14 secondi, di cui 7 di download dei dati :D

Grazie a tutti,soprattutto a Ricky!
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia