2012-07-24 12 views
6

Ho problemi con le prestazioni degli inserti sqlite anche con le transazioni. La mia app Android riceve circa 23.000 righe da un servizio web e devo inserirle in un'unica tabella.Gli inserimenti SQLite si rallentano anche con le transazioni

Il servizio Web è partizionato cosicché ricevo circa 2000 righe in ogni richiesta al WS e avvolgo gli inserti 2000 all'interno di una transazione. Dopo aver eseguito questi inserti, invio la nuova richiesta al WS e di nuovo utilizzo una nuova transazione per le nuove 2000 righe.

All'inizio funziona correttamente. Fa un sacco di inserti al secondo. ma con il tempo diventa più lento e alla fine finisce con 4 o 3 inserti al secondo fino a quando non completa le 23000 righe.

C'è un problema con le dimensioni del tavolo? Quando diventa più grande gli inserti diventano più lenti? C'è un modo per migliorare le prestazioni di quella grande quantità di dati?

Grazie per il vostro aiuto.

+3

Avete indici che potrebbero rallentare? E sei sicuro di aver inserito solo 2000 alla volta e non (tutti i dati ricevuti finora) ogni volta? –

+3

Sembra un set di lavoro di transazione che si espande in assenza di un COMMIT. – DaveE

+0

Beh, tutto dipende dai dati che stai inserendo, le stringhe rallenteranno il tuo db. Qual è la dimensione di quelle 2000 righe in termini di byte? Qual è la differenza di dimensioni nel file DB dopo l'inserimento di 2000 righe. Ho un db con 388000 righe e il suo 64M nella dimensione del file, ma i dati sono tutti i doppi. – JPM

risposta

1

Esiste un eccellente thread che copre le prestazioni di SQLite nella domanda How Do I Improve The Performance of SQLite? che è abbastanza buona. Vorrei andare almeno per le dichiarazioni preparate se non le stai già usando.

Tuttavia, dato che si tratta di Android, suppongo che si stiano correndo verso alcuni colli di bottiglia di I/O che scrivono sulla memoria flash. Prova a eseguire il codice su un paio di dispositivi diversi di produttori diversi, vedi se c'è una variazione estrema.

0

è necessario utilizzare il partizionamento dei dati. in quanto è possibile inserire 100 - 100 inserimenti uno per uno in modo che il processo risulti liscio e nessun problema di perdita di dati si verifichi.

un'altra cosa presumo che si sta utilizzando un thread asynch (può essere altro).

oppure è possibile utilizzare il servizio anche nell'ultimo caso per consumare tutti i dati alla volta.

Problemi correlati