[MediaWiki-commits] [Gerrit] Core data performance improvements. Bug T99260 - change (apps...wikipedia)
Fjalapeno has uploaded a new change for review. https://gerrit.wikimedia.org/r/211717 Change subject: Core data performance improvements. Bug T99260 .. Core data performance improvements. Bug T99260 Separate core data fetches into batches. Reset context in-between fetches to reduce memory. Move to async operations to allow UI to update progress during saves. Change-Id: Iffdb31166dacde1caef5d89f2050f11b404a85c7 --- M Wikipedia/Data/OldDataSchemaMigrator.m 1 file changed, 98 insertions(+), 36 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/apps/ios/wikipedia refs/changes/17/211717/1 diff --git a/Wikipedia/Data/OldDataSchemaMigrator.m b/Wikipedia/Data/OldDataSchemaMigrator.m index 616cb07..609bb32 100644 --- a/Wikipedia/Data/OldDataSchemaMigrator.m +++ b/Wikipedia/Data/OldDataSchemaMigrator.m @@ -105,48 +105,110 @@ } - (void)migrateData { -[self.context performBlock:^{ -NSFetchRequest* req = [NSFetchRequest fetchRequestWithEntityName:@Saved]; -req.sortDescriptors = @[[[NSSortDescriptor alloc] initWithKey:@dateSaved ascending:YES]]; -NSError* err; -NSArray* savedEntries = [self.context executeFetchRequest:req error:err]; - -if (err) { -NSLog(@Error reading old Saved entries: %@, err); +dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ +if (![self migrateHistory]) { } -NSFetchRequest* req2 = [NSFetchRequest fetchRequestWithEntityName:@History]; -req2.sortDescriptors = @[[[NSSortDescriptor alloc] initWithKey:@dateVisited ascending:YES]]; -NSError* err2; -NSArray* historyEntries = [self.context executeFetchRequest:req2 error:err2]; - -if (err2) { -NSLog(@Error reading old History entries: %@, err2); -} - -NSUInteger totalArticlesToMigrate = [savedEntries count]; -__block NSUInteger numberOfArticlesMigrated = 0; - -void (^ incrementAndNotify)(void) = ^void (void) { -numberOfArticlesMigrated++; -dispatch_async(dispatch_get_main_queue(), ^{ -[self.progressDelegate oldDataSchema:self didUpdateProgressWithArticlesCompleted:numberOfArticlesMigrated total:totalArticlesToMigrate]; -}); -}; - -for (History* history in historyEntries) { -[self migrateHistory:history]; -} - -for (Saved* saved in savedEntries) { -[self migrateSaved:saved]; -[self migrateArticle:saved.article]; -incrementAndNotify(); +if (![self migrateSavedPages]) { } [self moveOldDataToBackupLocation]; -[self.progressDelegate oldDataSchemaDidFinishMigration:self]; + +dispatch_async(dispatch_get_main_queue(), ^{ +[self.progressDelegate oldDataSchemaDidFinishMigration:self]; +}); +}); +} + +- (BOOL)migrateHistory { +__block NSError* error; + +[self.context performBlockAndWait:^{ +NSFetchRequest* req2 = [NSFetchRequest fetchRequestWithEntityName:@History]; +req2.sortDescriptors = @[[[NSSortDescriptor alloc] initWithKey:@dateVisited ascending:YES]]; +NSArray* historyEntries = [self.context executeFetchRequest:req2 error:error]; + +if (error) { +NSLog(@Error reading old History entries: %@, error); +} + +for (History* history in historyEntries) { +@autoreleasepool { +[self migrateHistory:history]; +} +} + +[self.context reset]; }]; + + +return error == nil; +} + +- (BOOL)migrateSavedPages { +__block NSError* error; +__block NSUInteger totalArticlesToMigrate = 0; +__block NSUInteger numberOfArticlesMigrated = 0; + +[self.context performBlockAndWait:^{ +NSFetchRequest* req = [NSFetchRequest fetchRequestWithEntityName:@Saved]; +req.sortDescriptors = @[[[NSSortDescriptor alloc] initWithKey:@dateSaved ascending:YES]]; +totalArticlesToMigrate = [self.context countForFetchRequest:req error:error]; +NSLog(@total articles: %lu, totalArticlesToMigrate); +}]; + +NSUInteger fetchSize = 25; +__block BOOL moreSavedEntriesToProcess = YES; +__block NSUInteger fetchOffset = 0; + +if (totalArticlesToMigrate 0) { +while (moreSavedEntriesToProcess) { +NSFetchRequest* req = [NSFetchRequest fetchRequestWithEntityName:@Saved]; +req.sortDescriptors = @[[[NSSortDescriptor alloc] initWithKey:@dateSaved ascending:YES]]; +req.fetchLimit = fetchSize; +req.fetchOffset = fetchOffset; + +[self.context performBlock:^{ +NSError* innerError; +NSArray* savedEntries = [self.context executeFetchRequest:req error:innerError]; + +if (savedEntries) { +
[MediaWiki-commits] [Gerrit] Core data performance improvements. Bug T99260 - change (apps...wikipedia)
Bgerstle has submitted this change and it was merged. Change subject: Core data performance improvements. Bug T99260 .. Core data performance improvements. Bug T99260 Separate core data fetches into batches. Reset context in-between fetches to reduce memory. Move to async operations to allow UI to update progress during saves. Change-Id: Iffdb31166dacde1caef5d89f2050f11b404a85c7 --- M Wikipedia/Data/OldDataSchemaMigrator.m 1 file changed, 98 insertions(+), 36 deletions(-) Approvals: Bgerstle: Looks good to me, approved jenkins-bot: Verified diff --git a/Wikipedia/Data/OldDataSchemaMigrator.m b/Wikipedia/Data/OldDataSchemaMigrator.m index 616cb07..609bb32 100644 --- a/Wikipedia/Data/OldDataSchemaMigrator.m +++ b/Wikipedia/Data/OldDataSchemaMigrator.m @@ -105,48 +105,110 @@ } - (void)migrateData { -[self.context performBlock:^{ -NSFetchRequest* req = [NSFetchRequest fetchRequestWithEntityName:@Saved]; -req.sortDescriptors = @[[[NSSortDescriptor alloc] initWithKey:@dateSaved ascending:YES]]; -NSError* err; -NSArray* savedEntries = [self.context executeFetchRequest:req error:err]; - -if (err) { -NSLog(@Error reading old Saved entries: %@, err); +dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ +if (![self migrateHistory]) { } -NSFetchRequest* req2 = [NSFetchRequest fetchRequestWithEntityName:@History]; -req2.sortDescriptors = @[[[NSSortDescriptor alloc] initWithKey:@dateVisited ascending:YES]]; -NSError* err2; -NSArray* historyEntries = [self.context executeFetchRequest:req2 error:err2]; - -if (err2) { -NSLog(@Error reading old History entries: %@, err2); -} - -NSUInteger totalArticlesToMigrate = [savedEntries count]; -__block NSUInteger numberOfArticlesMigrated = 0; - -void (^ incrementAndNotify)(void) = ^void (void) { -numberOfArticlesMigrated++; -dispatch_async(dispatch_get_main_queue(), ^{ -[self.progressDelegate oldDataSchema:self didUpdateProgressWithArticlesCompleted:numberOfArticlesMigrated total:totalArticlesToMigrate]; -}); -}; - -for (History* history in historyEntries) { -[self migrateHistory:history]; -} - -for (Saved* saved in savedEntries) { -[self migrateSaved:saved]; -[self migrateArticle:saved.article]; -incrementAndNotify(); +if (![self migrateSavedPages]) { } [self moveOldDataToBackupLocation]; -[self.progressDelegate oldDataSchemaDidFinishMigration:self]; + +dispatch_async(dispatch_get_main_queue(), ^{ +[self.progressDelegate oldDataSchemaDidFinishMigration:self]; +}); +}); +} + +- (BOOL)migrateHistory { +__block NSError* error; + +[self.context performBlockAndWait:^{ +NSFetchRequest* req2 = [NSFetchRequest fetchRequestWithEntityName:@History]; +req2.sortDescriptors = @[[[NSSortDescriptor alloc] initWithKey:@dateVisited ascending:YES]]; +NSArray* historyEntries = [self.context executeFetchRequest:req2 error:error]; + +if (error) { +NSLog(@Error reading old History entries: %@, error); +} + +for (History* history in historyEntries) { +@autoreleasepool { +[self migrateHistory:history]; +} +} + +[self.context reset]; }]; + + +return error == nil; +} + +- (BOOL)migrateSavedPages { +__block NSError* error; +__block NSUInteger totalArticlesToMigrate = 0; +__block NSUInteger numberOfArticlesMigrated = 0; + +[self.context performBlockAndWait:^{ +NSFetchRequest* req = [NSFetchRequest fetchRequestWithEntityName:@Saved]; +req.sortDescriptors = @[[[NSSortDescriptor alloc] initWithKey:@dateSaved ascending:YES]]; +totalArticlesToMigrate = [self.context countForFetchRequest:req error:error]; +NSLog(@total articles: %lu, totalArticlesToMigrate); +}]; + +NSUInteger fetchSize = 25; +__block BOOL moreSavedEntriesToProcess = YES; +__block NSUInteger fetchOffset = 0; + +if (totalArticlesToMigrate 0) { +while (moreSavedEntriesToProcess) { +NSFetchRequest* req = [NSFetchRequest fetchRequestWithEntityName:@Saved]; +req.sortDescriptors = @[[[NSSortDescriptor alloc] initWithKey:@dateSaved ascending:YES]]; +req.fetchLimit = fetchSize; +req.fetchOffset = fetchOffset; + +[self.context performBlock:^{ +NSError* innerError; +NSArray* savedEntries = [self.context executeFetchRequest:req error:innerError]; + +if (savedEntries) { +for (Saved* saved in savedEntries)