2011-11-10 2 views
3

80,000 개 이상의 행과 100 개의 열을 포함하는 CSV 파일이 있습니다. 가능한 가장 효율적인 방법으로 CSV 데이터로드/액세스를 처리하려고합니다. 현재 CSVParser는 NSArray에 데이터를로드하지만 매우 느리거나 느립니다. 이것은 모바일 장치에서 파싱/로딩을 처리하기를 희망하면서 문제가됩니다. 바로 아이폰입니다.큰 CSV 파일을로드 할 때의 성능 문제 (Objective-C)

다른 방법에 대한 제안은 많은 도움이 될 것입니다. 감사합니다

UPDATE : 나중에 참조/토론, 내가 지금 가지고있는 다음과 같은 시도에 대한

: 나는 당신이 "다른 방법"무슨 뜻인지 모르겠지만

// Mark time the parser starts 
NSTimeInterval start = [NSDate timeIntervalSinceReferenceDate]; 
// Parse the CSV file 
[parser parse]; 
NSTimeInterval end = [NSDate timeIntervalSinceReferenceDate]; 

// Print how long the parsing took 
NSLog(@"raw difference: %f", (end-start)); 

// Copy the allLines array from the parsing delegate 
NSArray *allOfTheRows = [NSArray arrayWithArray:d.allLines]; 
NSLog(@"There are %i lines in the csv file", [allOfTheRows count]); 

NSFileManager *f = [[NSFileManager alloc] init]; 
NSString *filePath = @"/Users/..../rawData"; // This is of course not a literal location... 

// Archive the array as NSData 
NSData *someData = [NSKeyedArchiver archivedDataWithRootObject:allOfTheRows]; 

// Write the data to a file 
[f createFileAtPath:filePath contents:someData attributes:nil]; 

/* 
If I were to load the data from the iPhone, i'd copy the newly created someData file above to my application's mainBundle, and then unarchive the NSData to an array on the iPhone 
*/ 
// Read the data back as an array 
NSData *readData = [NSData dataWithContentsOfFile:filePath]; 

NSArray *bigCollectionReadBack = [NSKeyedUnarchiver unarchiveObjectWithData:readData]; 
+0

정말 데이터를 어떻게 사용하고 데이터가 좋은 대체 접근 방식을 제안 할 수 있을지에 따라 달라집니다. CSV는 최상의 옵션이 아닐 수도 있습니다 (옵션이있는 경우) – Danny

답변

4

iPhone에서 CSV 구문 분석과 비슷한 문제가있었습니다. Mac에서 구문 분석을 수행하고 구조체 데이터 배열이 포함 된 이진 파일을 작성했습니다. iPhone 4에서 CSV 파일을 구문 분석 /로드하는 데 120 초가 걸렸지 만 이진 파일은 10 밀리 초 미만으로로드됩니다.

편집은 - 다음 fwrite를 사용하여 이진 파일에 데이터를 쓰는 맥 I read the CSV file에, 좀 더 정교한 구조체의 여러 배열로 데이터를 구성합니다. iOS에서는 fread(크기 정보를 얻기 위해 헤더를 읽었고 두 번째 데이터를 읽음)을 사용하여 이진 파일을 올바른 크기의 구조체 배열로 읽었습니다. 큰 파일 중 하나는 2.2MB이고 fread를 사용하여 플래시에서 RAM으로 읽으려면 66msec가 걸립니다.

2011-11-15 17:32:35.304 -[BinFile initWithFile:] 001953f0 file Metro 
2011-11-15 17:32:35.370 -[BinFile initWithFile:] read 2217385 bytes (Metro) 
+0

답장을 보내 주셔서 감사합니다. 위의 질문을 일부 코드로 업데이트했습니다. 지금은 NSData (여전히 슬프게도 조금 시간이 걸립니다) 배열을 보관/unarchiving 해요 – Alec

+0

좀 더 정교하게 주시겠습니까?[: PLIST \t \t \t \t \t \t \t \t 형식 : NSPropertyListSerialization dataFromPropertyList NSPropertyListBinaryFormat_v1_0 ERRORDESCRIPTION : 및 오류] 을 NSData * binaryPlistData = 아마도 당신의 라인을 따라 뭔가를 사용; 감사합니다. – Alec

+0

위의 답변에 대한 자세한 내용을 추가했습니다. – progrmr

1

당신이있는 경우 거대한 데이터 세트 다른 방법은 당신을 도울 수 없습니다. 당신이 당신의 RAM (힌트 : NSFileHandle) 폭발하지 않도록 덩어리

  1. 로드 파일 : 어떻게 당신이 다음을 할 수있는 현재로드 프로세스

    최적화되어 있습니다

  2. 핸들을에 구문 분석

    : 당신이있는 경우
  3. 피 autoreleasing 개체 (모든 프로세서 코어를 사용) GCD와 다중 스레드는 당신이

UPDATE되는 ARP 사용 확인

파일이 장치의 리소스 폴더에 남아 있고 변경할 수 없다고 말하지 않았습니다 (외부 소스에서 다운로드하는 것처럼). 이 경우 progrmr 솔루션으로 이동하십시오.

관련 문제