Best practice per la memorizzazione di grandi quantità di dati con J2ME


9

Sto sviluppando un'applicazione J2ME che ha una grande quantità di dati da memorizzare sul dispositivo (nella regione di 1 MB ma variabile). Non posso fare affidamento sul file system, quindi sono bloccato il sistema di gestione della registrazione (RMS), che consente più archivi di dischi, ma ognuno ha una dimensione limitata. La mia piattaforma di destinazione iniziale, Blackberry, limita ciascuno a 64 KB.

Mi chiedo se qualcun altro ha dovuto affrontare il problema di archiviare una grande quantità di dati nel RMS e come l'hanno gestito? Sto pensando di calcolare le dimensioni dei record e dividere un set di dati su più negozi se è troppo grande, ma questo aggiunge molta complessità per mantenerlo intatto.

Esistono molti tipi diversi di dati memorizzati, ma in particolare un solo set supererà il limite di 64 KB.

  0

Potrebbe essere utile notare che alcuni dispositivi limitano anche il numero di archivi di record autorizzati. Questo può essere basso come 2. 18 mar. 152015-03-18 16:29:44

9

Per qualcosa oltre qualche kilobyte è necessario utilizzare JSR 75 o un server remoto. I record RMS sono estremamente limitati in termini di dimensioni e velocità, anche in alcuni telefoni di fascia più alta. Se devi gestire 1MB di dati in J2ME, l'unico modo affidabile e portatile è di memorizzarlo sulla rete. La classe HttpConnection e i metodi GET e POST sono sempre supportati.

Sui telefoni che supportano JSR 75 FileConnection può essere valida alternativa ma senza la firma del codice è un incubo di esperienza utente. Quasi tutte le chiamate API invocano una richiesta di sicurezza senza scelta di permessi generali. Le aziende che distribuiscono app con JSR 75 di solito necessitano di una mezza dozzina di binari per ogni porta solo per coprire una piccola parte dei possibili certificati. E questo è solo per i certificati del produttore; alcuni telefoni hanno solo certificati bloccati dal vettore.


3

Penso che l'approccio più flessibile sarebbe quello di implementare il proprio file system in cima al RMS. È possibile gestire i record RMS in modo simile ai blocchi su un disco rigido e utilizzare uno inode structure o simile per distribuire file logici su più blocchi. Suggerirei di implementare un byte o un'interfaccia orientata al flusso sulla parte superiore dei blocchi, e quindi eventualmente di creare un altro livello API in cima a quello per scrivere strutture di dati speciali (o semplicemente rendere serializzabili gli oggetti nel flusso di dati).

Tanenbaum's classical book on operating systems copre come implementare un semplice file system, ma sono sicuro che puoi trovare altre risorse online se non ti piace la carta.


4

Le prestazioni e l'implementazione RMS variano enormemente tra i dispositivi, quindi se la portabilità della piattaforma è un problema, è possibile che il codice funzioni bene su alcuni dispositivi e non su altri. RMS è progettato per memorizzare piccole quantità di dati (tabelle di punteggio elevato o quant'altro) non in grandi quantità.

È possibile che alcune piattaforme siano più veloci con i file memorizzati in più archivi di dischi. Alcuni sono più veloci con più record all'interno di un negozio. Molti sono ok per l'archiviazione, ma diventano insolitamente lenti quando si eliminano grandi quantità di dati dallo store.

La soluzione migliore è utilizzare JSR-75, laddove disponibile, e creare la propria interfaccia di archivio file che ritorna a RMS se non è supportata alcuna funzione migliore.

Sfortunatamente quando si tratta di JavaME, si è spesso interessati a scrivere varianti specifiche del proprio codice.


1

Sto appena iniziando a scrivere codice per JavaME, ma ho esperienza con le vecchie versioni di PalmOS, in cui tutti i blocchi di dati sono di dimensioni limitate, richiedendo la progettazione di strutture di dati utilizzando indici e offset di record.


2

Sotto Blackberry OS 4.6 il limite di dimensioni del negozio RMS è stato aumentato a 512 KB, ma questo non è di grande aiuto in quanto molti dispositivi probabilmente non supportano 4.6.L'altra opzione su Blackberry è il negozio permanente che ha un limite di dimensioni record di 64 kb ma nessun limite per le dimensioni del negozio (oltre ai limiti fisici del dispositivo).

Penso che Carlos e izb abbiano ragione.


2

È piuttosto semplice, utilizzare JSR75 (FileConnection) e ricordarsi di firmare il midlet con un certificato valido (attendibile).


1

Grazie a tutti per gli annunci utili. Alla fine, la soluzione più semplice era limitare la quantità di dati memorizzati, implementando codice che regola i dati in base alla grandezza del negozio e recuperando i dati dal server su richiesta se non sono memorizzati localmente. È interessante notare che il limite è aumentato in OS 4.6, con la fortuna che il mio codice si aggiusterà da solo e memorizzerà più dati :)

Sviluppare un'applicazione J2ME per Blackberry senza utilizzare il compilatore .cod limita l'uso di JSR 75 un po 'perché non possiamo firmare l'archivio. Come sottolineato da Carlos, questo è un problema su qualsiasi piattaforma e ho riscontrato problemi simili usando la parte PIM di esso. L'RMS sembra essere incredibilmente lento sulla piattaforma Blackberry quindi non sono sicuro di quanto sarebbe utile un file system inode/b-tree in cima, a meno che i dati non siano stati memorizzati nella cache e scritti su RMS in un thread in background a bassa priorità.

  0

Se ti sei registrato con RIM e hai ottenuto una chiave di firma, puoi utilizzare l'API dell'archivio permanente, in cui la memorizzazione di anche megabyte di dati funziona correttamente. Penso che la chiave di firma non costa molto. 29 set. 082008-09-29 10:33:26

  0

Come ho detto, sto solo utilizzando le API J2ME. Non riesco ad accedere alle API RIM altrimenti non avrei questo problema. 02 ott. 082008-10-02 22:07:45


2

Per sola lettura Sto arrivando a tempi accettabili (entro 10 secondi), indicizzando un file di risorse. Ho due esportazioni di listino prezzi CSV da ~ 800KB. Classi di programmi e entrambi i file vengono compressi in un JAR da 300 KB.

sulla ricerca visualizzo un List ed eseguire una due Thread s in background per riempirlo, quindi i primi risultati arrivano abbastanza velocemente e sono visualizzabili immediatamente. Per prima cosa ho implementato una semplice ricerca lineare, ma era troppo lenta (~ 2min).

Quindi ho indicizzato il file (che è ordinato alfabeticamente) per trovare l'inizio di ogni lettera. Ora, prima di analizzare riga per riga, per prima cosa devo inserire InputStreamReader.skip() nella posizione desiderata, in base alla prima lettera. Sospetto che il ritardo derivi principalmente dalla decompressione della risorsa, quindi suddividere le risorse accelererebbe ulteriormente. Non voglio farlo, per non perdere il vantaggio di un facile aggiornamento. CSV vengono esportati senza alcun pre-elaborazione.