Autore Topic: Gestione grosse quantità di dati  (Letto 2087 volte)

Offline saledan

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Tab 2 10.1" Wifi+3G
  • Sistema operativo:
    Mac OSX 10.6
Gestione grosse quantità di dati
« il: 29 Agosto 2012, 10:08:43 CEST »
0
Ciao,
mi trovo a dover gestire una grossa quantità di dati.. però non riesco a capire quale sia il limite di record per ogni tabella che può sostenere l'sqlite senza far decadere le prestazioni?

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Gestione grosse quantità di dati
« Risposta #1 il: 29 Agosto 2012, 10:31:06 CEST »
0
Dipende da come implementi le query per l'estrazione successiva, devi ottimizzare quelle e non preoccuparti troppo della mole dei dati! ;)

Offline saledan

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Tab 2 10.1" Wifi+3G
  • Sistema operativo:
    Mac OSX 10.6
Re:Gestione grosse quantità di dati
« Risposta #2 il: 29 Agosto 2012, 10:48:15 CEST »
0
Cioè secondo te lui è in grado in una tabella di avere anche 1.500.000 record?
E' solo la query a fare differenza?

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Gestione grosse quantità di dati
« Risposta #3 il: 29 Agosto 2012, 10:55:30 CEST »
0
Un database non è altro che un file sequenziale, fino a quando c'è spazio su filesystem non vedo problemi!

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Gestione grosse quantità di dati
« Risposta #4 il: 29 Agosto 2012, 11:18:20 CEST »
0
Questi sono i limiti di SQLite, sono molto grandi:

http://www.sqlite.org/limits.html

Android ha ulteriori limiti come la massima memoria occupata dall'applicazione durante il suo funzionamento, dipende dalla versione di Android (il valore è riportato da "ActivityManager.getMemoryClass()"), sui cellulari varia dai 16 MB a 48 MB, non possono essere superati (al massimo è possibile aumentarli, ma di poco).
adb logcat | tee /tmp/logcat | grep TAG

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Gestione grosse quantità di dati
« Risposta #5 il: 29 Agosto 2012, 11:26:58 CEST »
0
A parte farsi domande e cercare dati, fossi in te proverei con un'app minimale: due Button e una TextView, col primo Button crei un database e lo riempi con dati random fino a 1.5M righe e scrivi nella TextView il tempo impiegato, col secondo fai una query sul database e di nuovo scrivi nella TextView il tempo impiegato (ovviamente in thread separati da quello di UI). Se poi vuoi un profiling a grana più fine, vai di TraceView.

Se lo fai, posta i risultati... è interessante.  :-)
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Gestione grosse quantità di dati
« Risposta #6 il: 29 Agosto 2012, 11:29:01 CEST »
0
Android ha ulteriori limiti come la massima memoria occupata dall'applicazione durante il suo funzionamento, dipende dalla versione di Android (il valore è riportato da "ActivityManager.getMemoryClass()"), sui cellulari varia dai 16 MB a 48 MB, non possono essere superati (al massimo è possibile aumentarli, ma di poco).

Qui mi hai fatto venire un dubbio. Ma il framework android, da buon sistema linux, non utilizza il file di paging e quindi la swap per aumentare il limite fisico della memoria?

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Gestione grosse quantità di dati
« Risposta #7 il: 29 Agosto 2012, 11:32:49 CEST »
0
A parte farsi domande e cercare dati, fossi in te proverei con un'app minimale: due Button e una TextView, col primo Button crei un database e lo riempi con dati random fino a 1.5M righe e scrivi nella TextView il tempo impiegato, col secondo fai una query sul database e di nuovo scrivi nella TextView il tempo impiegato (ovviamente in thread separati da quello di UI). Se poi vuoi un profiling a grana più fine, vai di TraceView.

Se lo fai, posta i risultati... è interessante.  :-)

In ogni caso 1,5M di dati in un db non sono poi un evento cosi tanto eccezionale... tutti i db (compresi i più lite come quello di android) hanno in quel numero un utilizzo più che normale... certo che se poi fai un "SELECT * FROM tabella" ti esplode il cellulare in mano, ma sei tu che stai sbagliando ad utilizzare il db!

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Gestione grosse quantità di dati
« Risposta #8 il: 29 Agosto 2012, 12:30:10 CEST »
0
Qui mi hai fatto venire un dubbio. Ma il framework android, da buon sistema linux, non utilizza il file di paging e quindi la swap per aumentare il limite fisico della memoria?

Sotto Linux si usa la partizione di swap, è possibile con i loop device usare anche i file ma sono poco usati. Non ho mai visto una rom stock con lo swap attivo, al massimo ho visto solo la CyanogenMod con la possibilità di abilitare lo swap. Esiste sempre con la CyanogenMod la CompCache, uno swap in memoria RAM compresso.

Come è stato detto i limite della memoria può entrare in gioco se al database viene richiesto una grassa quantità di dati temporanei da mantenere in memoria.

SQLite può creare database solo in memoria, Sotto Android basta aprire un file col nome null, non esiste il database come file persistente nel file system, si utilizza la RAM per mantenere anche tutti i dati.

Per testare le prestazioni è possibile utilizzare direttamente il binario "sqlite3", è presente nel emulatore o si trova in giro già compilato per ARM, basta copiarlo in una directory scrivibile. Via "adb shell" è possibile eseguire il comando "sqlite3" per aprire il database e abilitare la misurazione dei tempi di esecuzioni con il comando ".time ON". Ad esempio:

Codice: [Seleziona]
PC> adb shell

Android> sqlite3 file_database.db

SQLite version 3.6.22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"

sqlite> .timer ON
sqlite> select * from test_table;
....
CPU Time: user 0.72989 sys 0.210968
sqlite>

adb logcat | tee /tmp/logcat | grep TAG

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Gestione grosse quantità di dati
« Risposta #9 il: 29 Agosto 2012, 12:37:43 CEST »
0
SQLite può creare database solo in memoria, Sotto Android basta aprire un file col nome null, non esiste il database come file persistente nel file system, si utilizza la RAM per mantenere anche tutti i dati.

Questa tua frase non mi è chiara... quello che stai dicendo è che al momento dell'open del db il framework cerca il file .db e lo carica totalmente in memoria e lo tiene li fino al close?

Mi sembra parecchio strano come funzionamento...

Offline saledan

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Tab 2 10.1" Wifi+3G
  • Sistema operativo:
    Mac OSX 10.6
Re:Gestione grosse quantità di dati
« Risposta #10 il: 29 Agosto 2012, 12:48:33 CEST »
0
Sta diventando una conversazione interessante.
La pagina di sqlite sui limiti l'avevo vista, però pone altri limiti, non parla di dimenisioni o quantità dati.
Una nota aggiuntiva, svilupperò su tablet e non cellulare..

grazie a tutti per le risposte che mi state dando!!

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Gestione grosse quantità di dati
« Risposta #11 il: 29 Agosto 2012, 12:52:15 CEST »
0
La pagina di sqlite sui limiti l'avevo vista, però pone altri limiti, non parla di dimenisioni o quantità dati.

?

Citazione
Maximum Number Of Rows In A Table

The theoretical maximum number of rows in a table is 2^64 (18446744073709551616 or about 1.8e+19). This limit is unreachable since the maximum database size of 14 terabytes will be reached first. A 14 terabytes database can hold no more than approximately 1e+13 rows, and then only if there are no indices and if each row contains very little data.

Offline saledan

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Tab 2 10.1" Wifi+3G
  • Sistema operativo:
    Mac OSX 10.6
Re:Gestione grosse quantità di dati
« Risposta #12 il: 29 Agosto 2012, 12:53:41 CEST »
0

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Gestione grosse quantità di dati
« Risposta #13 il: 29 Agosto 2012, 13:13:25 CEST »
0
al momento dell'open del db il framework cerca il file .db e lo carica totalmente in memoria e lo tiene li fino al close?

Un database su file non viene caricato tutto in memoria quando viene aperto, non ho mai scritto questo.

SQLite può creare database su file o solo in memoria. Se specifichi il nome del file il database è creato in modo permanente nel file system, se è null è solo in memoria, è documentato nel API di Android:

SQLiteOpenHelper | Android Developers

Un database solo in memoria serve per elaborare dati temporanei, tutti i dati spariscono dopo la chiusura. Qui ci sono i dettagli del funzionamento di un database solo in memoria:

In-Memory Databases
adb logcat | tee /tmp/logcat | grep TAG

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Gestione grosse quantità di dati
« Risposta #14 il: 29 Agosto 2012, 14:08:17 CEST »
0
Un database su file non viene caricato tutto in memoria quando viene aperto, non ho mai scritto questo.

Sorry, avevo capito male io!  :-X