Italian [B4A] Scrivere dati in locale - che sistema usare?

amorosik

Well-Known Member
Licensed User
Programma su Android per tracciare percorso bici col gps del telefono
Normalmente salvo su file di testo nella memoria esterna
Una roba del tipo

B4X:
Dim rp As RuntimePermissions
Dim LogDir As String=rp.GetSafeDirDefaultExternal("App_Bici")
Dim nome_file As String="file_log.txt"
Dim Writer As TextWriter
Writer.Initialize(File.OpenOutput( LogDir, nome_file, True))
Writer.WriteLine(DateTime.date(DateTime.now) & " - " &  stringa_da_loggare & Chr(13) & Chr(10))
Writer.Flush
Writer.Close

Ma sto notando che quando il file diventa di qualche decina di megabyte, la scrittura inizia a rallentare
Forse non e' la scrittura ma la lettura prima della scrittura nuova riga, poiche' la nuova riga viene messa in coda al file
La domanda e': come registrare informazioni in locale (memoria interna, esterna, sd card) senza che ci sia questo rallentamento dovuto alla mole di dati gia' registrati?
 

LucaMs

Expert
Licensed User
Se non è necessario accedere ai dati dall'esterno (altra app o magari pc), sempre meglio usare la File.DirInternal (accessibile solo all'app stessa e non servono permessi).

Un file di solo testo "quache decina di megabyte"? Se registri un anno almeno di dati, suppongo, oppure le coordinate ogni decimo di secondo!
Immagino che i dati più vecchi non ti servano, per cui escogita un modo per eliminarli; ad esempio, rileva le dimensioni del file e se supera un certo limite eliminalo e ricrealo. Oppure, salva su DB SQLite, rimuovendo i record con date più vecchie.
 

amorosik

Well-Known Member
Licensed User
Vorrei salvare su memoria esterna perche' poi e' piu' semplice andare a leggere il file anche via Team Viewer o simile
In realta' ogni riga non contiene solo la posizione ma anche altri dati, ed e' quasi un migliaio di byte
Una riga ogni 10 secondi fa circa 1000x6 byte/minuto, 6000 x 60 x 24 = quasi 9 Mbyte al giorno
Supponiamo di usare Sqlite, dici che cambierebbe qualcosa in termini di prestazioni?
 

LucaMs

Expert
Licensed User
Una riga ogni 10 secondi fa circa 1000x6 byte/minuto, 6000 x 60 x 24 = quasi 9 Mbyte al giorno
Programma su Android per tracciare percorso bici col gps del telefono
Conosci qualcuno che vada in giro in bici 24h / 24h? Fallo ricoverare 😄

Supponiamo di usare Sqlite, dici che cambierebbe qualcosa in termini di prestazioni?
Teoricamente dovrebbe essere peggiore, soprattutto se usi un indice; in un file di testo, sempre teoricamente, l'app dovrebbe solo "appendere" il testo da scrivere.
L'importante, secondo me, è che cancelli dati vecchi.
 

amorosik

Well-Known Member
Licensed User
Si dai, capiamoci, i 9 Mbyte al giorno era per dare un'idea, mica c'e' Moser sui pedali
Quindi LA soluzione potrebbe essere fare dei file per giorno, e quindi contenerne le dimensioni, avendo pero' piu' file
Si diciamo che e' accettabile
 

sirjo66

Well-Known Member
Licensed User
Teoricamente dovrebbe essere peggiore

Secondo me invece sarebbe la soluzione ottimale, una riga per ogni registrazione, tenendo data e ora in un campo apposito, in modo da cancellare i dati vecchi senza problemi.
Il problema però potrebbe nascere nel momento in cui vuoi leggere i dati da un'altra applicazione, perchè non ti trovi più un file TXT ma un file di database, comunque potresti prevedere dal tuo programma una funzione di "export", cioè che crea il file TXT sulla memoria esterna leggendo i dati da SQLlite

La migliore di tutti sarebbe fare delle prove
 
Last edited:

hatzisn

Well-Known Member
Licensed User
Perche non apri il file quando l'Activity/B4XPage commincia, scrivere (append) i dati ogni T secondi e salvi e chiudi il file quando l'Activity/B4XPage finisce?
Un altro modo potrebbe essere aggiungere i dati in una lista in memoria e poi al momento giusto salvare tutti i nuovi dati nel file.
 

amorosik

Well-Known Member
Licensed User
Perche non apri il file quando l'Activity/B4XPage commincia, scrivere (append) i dati ogni T secondi e salvi e chiudi il file quando l'Activity/B4XPage finisce?
Un altro modo potrebbe essere aggiungere i dati in una lista in memoria e poi al momento giusto salvare tutti i nuovi dati nel file.

Mi sembra piu' sicuro aggiungere una riga alla volta
Se apri all'avvio, scrivi, scrivi, scrivi, e poi chiudi, magari il sistema operativo usa una cache per tenere le informazioni e se si pianta programma o android si perdono tutte le righe 'pendenti' dall'avvio
In realta' non so esattamente come Android regoli queste funzionalita', ma 'a naso' mi sembra piu' sicura l'aggiunta delle singole righe al file di testo
 

udg

Expert
Licensed User
L'idea di @hatzisn mi pare più che valida e ragionevole in questo contesto. Potresti registrare un batch di 6 righe ogni minuto, limitando il rischio di perdita dati al minuto.
In pratica registri in memoria fino a 6 eventi, poi flush sul file e ricominci. Poi che siano 6 o 10 o 20 alla volta..
Personalmente preferirei sqlite e la possibilità di esportare/eliminare, ma anche avere dei file giornalieri (che ogni x giorni elimini) può funzionare.
 
Top