J'ai besoin d'analyser un fichier XML assez volumineux (variant entre une centaine de kilo-octets et plusieurs centaines de kilo-octets), ce que j'utilise Xml#parse(String, ContentHandler)
. Je teste actuellement cela avec un fichier de 152 Ko.
Au cours de l' analyse syntaxique, je également insérer les données dans une base de données SQLite utilisant des appels similaires à ce qui suit: getWritableDatabase().insert(TABLE_NAME, "_id", values)
. Tout cela prend environ 80 secondes pour le fichier de test de 152 Ko (ce qui revient à insérer environ 200 lignes).
Lorsque je commente toutes les instructions d'insertion (mais que je laisse tout le reste, comme la création, ContentValues
etc.), le même fichier ne prend que 23 secondes.
Est-il normal que les opérations de base de données aient une telle surcharge? Puis-je faire quelque chose à ce sujet?
Étant donné que InsertHelper mentionné par Yuku et Brett est désormais obsolète (niveau d'API 17), il semble que la bonne alternative recommandée par Google soit l'utilisation de SQLiteStatement .
J'ai utilisé la méthode d'insertion de base de données comme ceci:
Après avoir également rencontré de sérieux problèmes de performances, le code suivant a accéléré mes 500 insertions de 14,5 secondes à seulement 270 ms , incroyable!
Voici comment j'ai utilisé SQLiteStatement:
la source
La compilation de l'instruction d'insertion SQL permet d'accélérer les choses. Cela peut également nécessiter plus d'efforts pour tout consolider et empêcher une éventuelle injection, car tout est désormais sur vos épaules.
Une autre approche qui peut également accélérer les choses est la classe android.database.DatabaseUtils.InsertHelper sous-documentée. Je crois comprendre qu'il encapsule en fait les instructions d'insertion compilées. Passer des insertions transactées non compilées aux insertions transactées compilées représentait un gain de vitesse d'environ 3x (2 ms par insert à 0,6 ms par insert) pour mes insertions SQLite volumineuses (200K + entrées) mais simples.
Exemple de code:
la source
Si la table contient un index, envisagez de le supprimer avant d'insérer les enregistrements, puis de le rajouter après avoir validé vos enregistrements.
la source
Si vous utilisez un ContentProvider:
Ensuite, la fonction privée pour effectuer l'insertion (toujours à l'intérieur de votre fournisseur de contenu):
la source