Autore Topic: gestione dati di grosse dimensioni  (Letto 620 volte)

Offline uomosound18

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
gestione dati di grosse dimensioni
« il: 18 Aprile 2013, 10:18:55 CEST »
0
Salve a tutti, sono nuovo del forum. Sto sviluppando da poco una applicazione per android, una sorta di gioco di parole. Il problema principale è la gestione del mio dizionario, composto da 120.000 termini. Tutte le parole sono composte da 3 a 9 lettere e le sistemo all'interno di una hashMap con struttura:

Anagramma --> lista parole
eeirrsv --> reversi riserve riverse servire sverrei

Inizialmente, creo una la mappa e la salvo su file. "Manualmente" copio questo semplice file txt all'interno di assets del progetto.
Durante l' applicazione, io devo caricare questo file(so come leggere da assets), dentro una struttura dati(per l' appunto una mappa) e poi, fare delle ricerche, che sono veloci per la struttura dati usata.

Il mio problema e che non so quando effettuare il ripristino della mappa stessa, perchè se lo faccio dopo la fine di una activity, l'altra activity va in "out of memory".

Secondo voi, creare all' inizio uno splashscreen, caricare li la mia mappa, e poi lanciare la MainActivity, risolverebbe il problema?
Avete soluzioni per la gestione di una mole di dati cosi grande? Ho letto che si possono usare altre strutture dati, ma secondo me il passaggio critico file-->oggetto è inevitabile.

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 dati di grosse dimensioni
« Risposta #1 il: 18 Aprile 2013, 10:28:43 CEST »
0
Probabilmente basi dati di queste dimensioni sarebbe meglio non caricarle in memoria. Per evitare limitazioni di certi dispositivi, pesantezza dell'app, facilità di crash, etc.

Hai già considerato di caricarle in un database sqlite e usare quello per l'accesso?
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline uomosound18

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:gestione dati di grosse dimensioni
« Risposta #2 il: 18 Aprile 2013, 11:01:50 CEST »
0
Innanzitutto, grazie per avermi risposto. SQLite non lo avevo considerato. Tu pensi possa essere più efficente? pensi che devo sempre rispettare la struttura anagrammi--> parole?

Ipotizziamo di dover quindi salvare su DB.
Alla fine di una activity A , devo generare delle chiavi (anagrammi). Queste chiavi le devo cercare sul DB, e acquisire la lista delle parole per ogni chiave, per poi visualizzare all' utente il risultato in una activity B. Tra una activity e l' altra, posso fare tutte queste query? come dovrei gestire il tempo che intercorre tra l' inizio della richiesta e la fine di essa?

PS: come salvare una lista di stringhe in un DB? Intanto faccio ricerca sul amico google.. ma se qualcuno sa gia la risposta.. mi farebbe una grossa cortesia
« Ultima modifica: 18 Aprile 2013, 11:10:31 CEST da uomosound18 »

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 dati di grosse dimensioni
« Risposta #3 il: 18 Aprile 2013, 12:32:21 CEST »
0
L'uso di SQLite potrebbe non essere più efficiente, ma con un numero molto elevato di righe è incredibilmente più stabile e affidabile.

Poi, in primissima approssimazione io salverei nel database una tabella a due colonne in tutto e per tutto equivalente alla HashMap. E ci accedi di nuovo in modo del tutto equivalente, perchè farai una query con una condizione analoga.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline uomosound18

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:gestione dati di grosse dimensioni
« Risposta #4 il: 18 Aprile 2013, 13:03:27 CEST »
0
E' quello che sto provando afare.. comunque ho scoperto che sqlite supporta gli oggetti blob. Ho creato il mio DB con due colonne... primary key l' anagramma, e come oggetto blob invece la lista delle parole.. Un oggetto blob pero, è un array di byte... devo vedere se riesco, dal array di byte, a ottenere la mia lista delle parole per ogni anagramma..

Offline lorux

  • Utente junior
  • **
  • Post: 97
  • Respect: +12
    • Google+
    • lor.catalano
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S2
  • Sistema operativo:
    Windows
Re:gestione dati di grosse dimensioni
« Risposta #5 il: 18 Aprile 2013, 13:14:30 CEST »
0
ma non devi salvarti il file nel db,devi salvarti l'elenco delle parole,come suggerisce bradipao

Offline uomosound18

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:gestione dati di grosse dimensioni
« Risposta #6 il: 18 Aprile 2013, 13:18:40 CEST »
0
Creo un DB con due colonne:
anagramma parole
è inserisco i miei anagrammi e parole(salvati su file o una struttura dati) nel db, non il file..
PROBLEMA: come salvo la lista delle parole associato a un anagramma sul DBSQLITE?

Mia soluzione... invece di salvare la lista delle parole, salvo la concatenazione delle parole, separate da spazio. questo pero mi comporta cicli for, conversioni e Tokenizer. avete soluzioni diverse?

Offline lorux

  • Utente junior
  • **
  • Post: 97
  • Respect: +12
    • Google+
    • lor.catalano
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S2
  • Sistema operativo:
    Windows
Re:gestione dati di grosse dimensioni
« Risposta #7 il: 18 Aprile 2013, 14:41:50 CEST »
0
ok per la tabella con 2 colonne anagramma - parola
ma devi inserire una riga per ogni parola,ad esempio

eeirrsv --> reversi riserve riverse servire sverrei

avrai nel db
anagramma - parola
eeirrsv | reversi
eeirrsv | riserve
eeirrsv | riverse
eeirrsv | servire
eeirrsv | sverrei

in pratica eeirrsv è una "chiave esterna"
se poi fai una query e cerchi anagramma = 'eeirrsv' avrai la lista delle parole per quell'anagramma

Offline uomosound18

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:gestione dati di grosse dimensioni
« Risposta #8 il: 18 Aprile 2013, 15:57:36 CEST »
0
Ho creato il DB come indicato. Prima di lanciare l' applicazione, vorrei chiedere due ultime cose:

- L'operazione di creazione del DB, la prima volta intendo, è molto gravosa per l' applicazione. E' possibile farla al momento dell' installazione dell'applicazione sul dispositivo? se si come?

-Attualmente, ho inserito il codice di creazione del DB nel metodo della classe Helper, onCreate. Dove dovrei creare il DB? Cioe, dove devo fare la new?Dovrei fare un splashScreen all' inizio dell' applicazione?
comunque so, che una volta creato, l' invocazione del metodo onCreate, verifica prima se esiste gia una versione del DB.

Conosco il linguaggio java, ma mi mancano alcuni dettagli proprio tecnici dei dispositivi in se... non ho idea dove e quando conviene creare il DB.

Offline blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1387
  • Respect: +164
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
Re:gestione dati di grosse dimensioni
« Risposta #9 il: 18 Aprile 2013, 17:02:46 CEST »
0
L'operazione di creazione del db é meglio che non la fai completamente dall'applicazione.
Il database lo crei una volta tu e lo metti nella cartella assets e lo leggi da lì.

« Ultima modifica: 18 Aprile 2013, 17:06:10 CEST da blackgin »
Postate il LogCat LogCat LogCat LogCat LogCat

Offline uomosound18

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:gestione dati di grosse dimensioni
« Risposta #10 il: 18 Aprile 2013, 17:04:57 CEST »
0
Come faccio a crearlo e a metterlo nella cartella assets? con un programma esterno?

Offline blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1387
  • Respect: +164
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
Re:gestione dati di grosse dimensioni
« Risposta #11 il: 18 Aprile 2013, 17:06:52 CEST »
0
Lo fai direttamente sul pc con un programma qualsiasi che trovi online.
Oppure lo fai una volta sul tuo telefono e ti copi il database creato.

Comunque per quanto riguarda la gestione dei dati, più che avere una singola tabella con tutte le associazioni possibili ti consiglio una struttura a due tabelle del genere:

Tabella 1: parole
Colonne: id_parola, parola

Tabella 2: anagrammi
Colonne: id_parola, id_anagramma

Esempio:

-parole
0, ciao
1, caio
2, sera
3, resa

-anagrammi
0,1
1,0
2,3
3,2
Postate il LogCat LogCat LogCat LogCat LogCat