Comment insérer 40000 rapidement les enregistrements dans une base de données sqlite dans un iPad
Je veux insérer 40000 enregistrements que je l'obtenir à partir d'un service web dans une base de données sqlite dans mon iPad.
J'ai écrit le code suivant, mais il faut environ 20 minutes, est-il un moyen plus rapide?
- (NSArray *)insertPriceSQLWithPrice:(Price *) price
{
SQLiteManager *dbInfo = [SQLiteManager sharedSQLiteManagerWithDataBaseName:@"codefuel_catalogo.sqlite"];
sqlite3 *database;
NSString *querySQL=[self formatStringQueryInsertWithTable:@"prices_list" andObject:price];
if(sqlite3_open([dbInfo.dataBasePath UTF8String], &database) == SQLITE_OK)
{
sqlite3_stmt * compiledStatement;
const char *query_stmt = [querySQL UTF8String];
int result = sqlite3_prepare_v2(database, query_stmt, -1, &compiledStatement, NULL);
if (result == SQLITE_OK)
{
int success = sqlite3_step(compiledStatement);
NSLog(@"el numero de success es -> %i",success);
if (success == SQLITE_ERROR)
NSLog(@"Error al insertar en la base de datps");
}
else
NSLog(@"Error %@ ERROR!!!!",querySQL);
sqlite3_finalize(compiledStatement);
}
sqlite3_close(database);
return nil;
}
Je prendrais l'ouverture et la fermeture de la base de données de la méthode. C'est vous coûter une quantité considérable de temps. Créer et conserver le connectoin à travers chacun des 40 000 insère ensuite le détruire une fois terminé. Aussi, le NSLogs peut être ralentissement de l'exécution réelle. J'avais essayer de l'exécuter sans les logs pour voir combien de temps cela prend.
Ne vous rouvrez la base de données de 40000 fois? (Vous devriez aussi éviter de recompilation de la déclaration une fois par enregistrement, et il est mieux de le faire tous les insère dans une transaction unique, mais c'est moins important que la réouverture pour chaque ligne).
Vous pouvez insérer plusieurs lignes par insertion avec le droit de requête, et envelopper l'ensemble du processus de transaction au moment de SQLite a à vider sur le disque après chaque insertion qui va ralentir vous à droite vers le bas. Vous pouvez également réutiliser la déclaration préparée à l'avance, juste de reliaison les valeurs modifiées à chaque fois
Ouvrir la DB et de la laisser ouverte, démarrer une transaction, la préparation de la déclaration qu'une seule fois.
Ne vous rouvrez la base de données de 40000 fois? (Vous devriez aussi éviter de recompilation de la déclaration une fois par enregistrement, et il est mieux de le faire tous les insère dans une transaction unique, mais c'est moins important que la réouverture pour chaque ligne).
Vous pouvez insérer plusieurs lignes par insertion avec le droit de requête, et envelopper l'ensemble du processus de transaction au moment de SQLite a à vider sur le disque après chaque insertion qui va ralentir vous à droite vers le bas. Vous pouvez également réutiliser la déclaration préparée à l'avance, juste de reliaison les valeurs modifiées à chaque fois
Ouvrir la DB et de la laisser ouverte, démarrer une transaction, la préparation de la déclaration qu'une seule fois.
OriginalL'auteur OscarVGG | 2013-01-31
Vous devez vous connecter pour publier un commentaire.
Il ya trois choses que vous devez faire afin d'accélérer les insertions:
sqlite3_open
en dehors de la boucle. Actuellement, la boucle n'est pas indiqué, donc je suppose que c'est à l'extérieur de votre extrait de codeBEGIN TRANSACTION
etCOMMIT TRANSACTION
appels - vous avez besoin pour commencer la transaction avant l'insertion de la boucle et à la fin juste après la boucle est terminée.formatStringQueryInsertWithTable
vraiment paramétrable - Actuellement, il semble que vous n'êtes pas à l'aide de déclarations préparées à leur maximum, car en dépit de l'aide desqlite3_prepare_v2
, vous n'avez pas d'appels desqlite3_bind_XYZ
dans votre code.Ici est un joli post qui vous montre comment faire tout le dessus de. C'est du C, mais il fonctionne parfaitement dans le cadre d'un programme C.
OriginalL'auteur dasblinkenlight
Pour moi, l'appel de COMMENCER l'OPÉRATION, puis le chargement de certaines 20 inserts, puis d'appeler COMMIT TRANSACTION a donné un 18x augmentation de la performance - bon conseil! La mise en cache les requêtes préparées était de peu d'aide.
OriginalL'auteur Jason