Preciso analisar um arquivo XML bastante grande (variando entre cerca de cem kilobytes e várias centenas de kilobytes), que estou fazendo usando Xml#parse(String, ContentHandler)
. No momento, estou testando isso com um arquivo de 152 KB.
Durante a análise, também insiro os dados em um banco de dados SQLite usando chamadas semelhantes às seguintes: getWritableDatabase().insert(TABLE_NAME, "_id", values)
. Tudo isso junto leva cerca de 80 segundos para o arquivo de teste de 152 KB (que se resume a inserir cerca de 200 linhas).
Quando comento todas as instruções de inserção (mas deixo todo o resto, como criar ContentValues
etc.), o mesmo arquivo leva apenas 23 segundos.
É normal que as operações do banco de dados tenham uma sobrecarga tão grande? Posso fazer algo sobre isso?
Como o InsertHelper mencionado por Yuku e Brett está obsoleto agora (API de nível 17), parece que a alternativa certa recomendada pelo Google é usar SQLiteStatement .
Eu usei o método de inserção de banco de dados assim:
Depois que também experimentei alguns problemas sérios de desempenho, o código a seguir acelerou minhas 500 inserções de 14,5 segundos para apenas 270 ms , incrível!
Aqui está como usei SQLiteStatement:
fonte
Compilar a instrução insert do sql ajuda a acelerar as coisas. Também pode exigir mais esforço para escorar tudo e evitar uma possível injeção, uma vez que agora está tudo em seus ombros.
Outra abordagem que também pode acelerar as coisas é a classe android.database.DatabaseUtils.InsertHelper pouco documentada. Meu entendimento é que ele realmente envolve instruções de inserção compiladas. Ir de inserções transacionadas não compiladas para inserções transacionadas compiladas teve um ganho de velocidade de cerca de 3x (2 ms por inserção a 0,6 ms por inserção) para minhas grandes (200K + entradas), mas inserções simples de SQLite.
Código de amostra:
fonte
Se a tabela tiver um índice, considere descartá-lo antes de inserir os registros e, em seguida, adicioná-lo de volta depois de confirmar seus registros.
fonte
Se estiver usando um ContentProvider:
Em seguida, a função privada para realizar a inserção (ainda dentro do seu provedor de conteúdo):
fonte