결론
문제가 해결 된 것 같습니다.
문제는이 방법론과는 아무런 관련이없는 것처럼 보이지만 XCode는 빌드간에 올바르게 프로젝트를 정리하지 못했습니다.
모든 테스트가 끝난 후에 사용 된 sqlite 파일은 아직 색인이 생성되지 않은 첫 번째 파일이었습니다 ......
Xcode 4.3.2에주의하십시오. Clean 청소, 또는 ... 자동으로 번들 리소스에 추가되지 않는 다른 답변을
감사합니다 ..대용량 CSV 파일을 코어 데이터에로드하는 가장 빠른 방법은 무엇입니까
업데이트를 프로젝트에 파일을 추가하지 않는 3
난 그냥 확인하기 위해 동일한 단계를 시도하는 사람을 초대하기 때문에 그들이 동일한 결과를 얻는다면, 내가 한 일을 상세히 설명해 드리겠습니다.
빈 프로젝트로 시작합니다
populateDb에 대한
[self performSelectorInBackground:@selector(populateDB) withObject:nil];
코드 :나는 첫 번째 문자열은
에서, 나는 finishLaunchingWithOptions 호출 오전 않았다
를 인덱싱 한 법인, 3 개 특성 (2 문자열, 1 플로트)
와 데이터 모델을 정의
-(void)populateDB{
NSLog(@"start");
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
NSManagedObjectContext *context;
if (coordinator != nil) {
context = [[NSManagedObjectContext alloc] init];
[context setPersistentStoreCoordinator:coordinator];
}
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"input" ofType:@"txt"];
if (filePath) {
NSString * myText = [[NSString alloc]
initWithContentsOfFile:filePath
encoding:NSUTF8StringEncoding
error:nil];
if (myText) {
__block int count = 0;
[myText enumerateLinesUsingBlock:^(NSString * line, BOOL * stop) {
line=[line stringByReplacingOccurrencesOfString:@"\t" withString:@" "];
NSArray *lineComponents=[line componentsSeparatedByString:@" "];
if(lineComponents){
if([lineComponents count]==3){
float f=[[lineComponents objectAtIndex:0] floatValue];
NSNumber *number=[NSNumber numberWithFloat:f];
NSString *string1=[lineComponents objectAtIndex:1];
NSString *string2=[lineComponents objectAtIndex:2];
NSManagedObject *object=[NSEntityDescription insertNewObjectForEntityForName:@"Bigram" inManagedObjectContext:context];
[object setValue:number forKey:@"number"];
[object setValue:string1 forKey:@"string1"];
[object setValue:string2 forKey:@"string2"];
NSError *error;
count++;
if(count>=1000){
if (![context save:&error]) {
NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
}
count=0;
}
}
}
}];
NSLog(@"done importing");
NSError *error;
if (![context save:&error]) {
NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
}
}
}
NSLog(@"end");
}
그 밖의 모든 것은 기본 코어 데이터 코드이며 아무 것도 추가되지 않습니다.
시뮬레이터에서 실행했습니다.
내가 갈 ~/라이브러리/응용 프로그램 생성 된 SQLite는 파일이
지원/아이폰 시뮬레이터/5.1/응용 프로그램 // 문서
나는 그것을 받아 내 번들
I 코멘트에 복사 전화에서 처음 실행
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
@synchronized (self)
{
if (__persistentStoreCoordinator != nil)
return __persistentStoreCoordinator;
NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"myProject" ofType:@"sqlite"];
NSString *storePath = [[[self applicationDocumentsDirectory] path] stringByAppendingPathComponent: @"myProject.sqlite"];
NSError *error;
if (![[NSFileManager defaultManager] fileExistsAtPath:storePath])
{
if ([[NSFileManager defaultManager] copyItemAtPath:defaultStorePath toPath:storePath error:&error])
NSLog(@"Copied starting data to %@", storePath);
else
NSLog(@"Error copying default DB to %@ (%@)", storePath, error);
}
NSURL *storeURL = [NSURL fileURLWithPath:storePath];
__persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error])
{
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return __persistentStoreCoordinator;
}
}
012에서 문서에 번들에서 sqlite가 파일을 복사 persistentStoreCoordinator을 편집
을 populateDb하기시뮬레이터에서 앱을 제거하고 ~/Library/Application Support/iPhone Simulator/5.1/Applications /가 이제 제거되었음을 확인하십시오.
다시 빌드하고 다시 실행하십시오.
예상대로 sqlite 파일이 ~/Library에 복사됩니다./Application Support/iPhone Simulator/5.1/Applications // Documents
그러나 파일의 크기가 번들보다 작습니다. 또한 다음과 같은 조건자를 사용하여 간단한 쿼리를 수행합니다. [NSPredicate predicateWithFormat : @ "string1 == % @", string1]; 분명히 문자열 1이, 난 그냥
시뮬레이터에서 실행하는 경우 경량 마이그레이션을 강제로, 의미없는 업데이트는 데이터 모델의 새 버전을 만들 더 이상
색인 그 다음되지 않는다는 것을 보여주고, 마이그레이션은 몇 소요 초 만에 데이터베이스의 크기가 두 배로 늘어 났으며 동일한 쿼리가 이제는 분이 아닌 일 초 만에 반환됩니다.
이것은 내 문제를 해결하고 강제로 마이그레이션을 수행 할 수 있지만 동일한 마이그레이션은 iPad에서 3 분이 걸리고 포 그라운드에서 발생합니다.
모자를 쓰고있는 바로 지금, 나에게 가장 좋은 해결책은 여전히 색인을 제거하지 못하게하는 것입니다. 실행시 다른 가져 오기 솔루션은 너무 많은 시간이 걸립니다.
더 해명이 필요하면 알려주세요 ...
업데이트 2
그래서 내가 지금까지 가지고있는 최고의 결과가 유사과 빠른 도구에서 생성 된 SQLite는 파일로 핵심 데이터베이스를 시드하는 것입니다 데이터 모델이지만 sqlite 파일을 생성 할 때 인덱스가 설정되지 않습니다. 그런 다음 인덱스가 설정된 핵심 데이터 응용 프로그램에서이 sqlite 파일을 가져 와서 간단한 마이그레이션을 허용합니다. 새로운 iPad에 200 만 건의 기록을 남기려면이 마이그레이션 스틸은 3 분이 걸립니다. 최종 앱의 레코드 수는이 5 배가되어야하므로 처리 시간이 오래 걸립니다. 그 경로를 선택하면 새로운 질문이 생깁니다 : 백그라운드에서 간단한 마이그레이션을 수행 할 수 있습니까?
업데이트
내 질문은 코어 데이터의 데이터베이스를 채우는 한 다음 내 응용 프로그램에 sqlite가 파일을 가져올 수있는 도구를 만드는 방법이 아닙니다.
나는 이것을 어떻게하는지 안다. 나는 그것을 무수히했다.
하지만 지금까지는 그런 방법이 약간의 부작용을 일으킬 수 있다는 것을 깨닫지 못했습니다. 제 경우에는 결과 데이터베이스의 색인 된 속성이 sqlite 파일을 가져올 때 명확하게 '색인 해제'되어 나타납니다.
그러한 전송 후에도 색인 된 데이터가 여전히 색인화되어 있는지 확인할 수 있다면 진행 방법을 알고 싶거나 그러한 데이터베이스를 효율적으로 시드하는 최상의 전략이 무엇인지 알고 싶습니다.
원래
나는 4 열, 문자열과 수레와 큰 CSV 파일 (라인의 수백만)이있다. iOS 앱용입니다.
앱을 처음로드 할 때 핵심 데이터에로드해야합니다.
데이터가 사용 가능할 때까지는 앱이 거의 작동하지 않으므로 처음로 사용자가 앱을 실행하기 전에로드하는 데 20 분이 걸리지 않으므로 로딩 시간이 중요합니다.
지금 현재 코드는 2 백만 줄의 CSV 파일을 처리하기 위해 새 iPad에서 20 분이 걸립니다.
배경 컨텍스트를 사용하여 UI를 잠그지 않고 1,000 레코드마다 컨텍스트를 저장합니다.
시뮬레이터에서 데이터베이스를 생성 한 다음 문서 폴더에 복사/붙여 넣기했습니다. 첫 번째 출시는 대용량 데이터베이스 구축을위한 공식적인 방식이 아니기 때문에 가능합니다. 유감스럽게도, 인덱스는 그러한 전송에서 살아남지 못하는 것 같습니다. 데이터베이스가 단 몇 초 만에 사용 가능했지만 인덱스가 손실 되었기 때문에 성능이 심각합니다. 이미 인덱스에 관한 질문을 게시했지만 좋은 대답은 아닌 것 같습니다.
- 데이터베이스가 미리로드하고 처음 시작할 때 이동 한 경우 핵심 데이터에
- 을 기록 수백만로드에 대한 성능을 개선 할 수있는 방법, 방법 : 나는 대한 하나를 찾고 있어요 그래서
내 인덱스를 유지하려면 - 이러한 종류의 시나리오를 처리하는 모범 사례.처음 사용하기 전에 x 분 동안 기다려야하는 앱을 사용하는 것을 기억하지 않습니다 (그러나 Daily, 아마도 끔찍한 경험이었습니다).
- 튜토리얼 등을 진행하면서 배경 가져 오기 ...
- 핵심 데이터를 사용하고 있지 않습니까?
- ...
그럼 제대로 작동하도록 프로젝트를 "정리"하는 방법은 무엇입니까? – lnafziger
클린이 작동하지 않았지만 랩탑을 재부팅하고 파일에 대한 모든 참조를 수동으로 청소하는 등의 작업은 문제를 '해결 한'것으로 보입니다. 이상한 ... 비록 내가 마이그레이션하지 않도록 강제로 가벼운 마이그레이션 라인을 제거해야했지만 (이것은 많은 시간이 걸릴 것입니다). 전반적으로, 이것은 내가 바라는 깨끗한 구현이 아니지만,이 작업은 ... 버전 2에서 데이터 모델 업그레이드가 필요할 때까지는 문제가 있습니다. –