2013-05-04 2 views
1

응용 프로그램에서 30,000 개의 객체가 포함 된 CSV 파일을 받았으며 각 객체마다 항상 24 개의 값 (총 72 만 개의 값)이 있습니다. value24
object2, 값 1, 값 2, ..., value24
...
objectn, 값 1,많은 수레를 NSNumber로 변환 할 때 성능 문제가 생깁니다.

오브젝트 1, 값 1, 값 2, ... :

형식은 다음과 같이이다 1, 값 2, ..., I이 파일을 구문 분석 할 때, 나는 NSStringNSArray의 각 행을 변환 value24

. NSMutableArray

NSNumber

  • 저장합니다 NSNumberfloat 변환

    1. 변환 NSString에서 float- (float)floatValue
    2. 사용 : 다음 I는 어레이의 각 값에 대해 다음을 수행 이 프로세스는 몇 초가 걸립니다. Instruments Time Profiler 2 단계에서 3.5 초를 보내고 있습니다. & 3은 720,000 값입니다.

      NSNumber의 번역을 피하려면 어떻게해야합니까? []과 같은 C 스타일 배열을 사용할 수 있습니까? 또는 CFMutableArrayRef? 도움이된다면 각 개체에 항상 24 개의 값이 있다는 것을 알고 있습니다. 도움을

      감사합니다,

      세바스티앙.

  • +0

    nsnumberformatter를 사용하여 nsstring을 nsnumber로 직접 변환하고 프로파일 링 결과를 우리와 공유하려면 answerstackoverflow.com/questions/1448804/how-to-convert-an-nsstring-into-an-nsnumber를 시도하십시오. 부디. ps : nsnumberformatter의 인스턴스가 하나만 있으면됩니다.) –

    답변

    0

    개인적으로 나는 C 스타일 배열을 사용합니다.,

    @interface Row : NSObject { 
        float values[24]; 
    } 
    @end 
    

    그런 다음 각 행에 대해 인스턴스를 만들 직접 (24 개) 값을 설정하고 : 당신이 행에 의한 데이터 행을 처리하려면이 같은 각 행을 나타내는 개체, 뭔가를 할 수 인스턴스를 NSMutableArray에 추가하십시오. 당신은 앞을 알고있는 경우

    Row *row = [[[Row alloc] init] autorelease]; 
    // here's where you read in the data for the row and save the 24 values 
    row.values[0] = ... 
    ... 
    row.values[23] = ... 
    // and here you add the Row instance to an NSMutableArray 
    [rows addObject:row]; 
    

    그렇지 않으면, 당신은 당신이 수레의 30,000 X (24) 배열을 미리 할당 할 수 30,000 행을 기다리고있을 것입니다.
    float *rows = calloc(30000*24, sizeof(float)); 
    for (int i = 0; i < 30000; i++) { 
        float *values = rows[24*i]; 
        // here's where you read in the data for row i and save the 24 values 
        values[0] = ... 
        ... 
        values[23] = ... 
    } 
    

    그냥 당신이 그것을 완료하면 해당 calloc에서 메모리를 해제해야합니다 잊지 마세요.

    +0

    내가 찾고있는 것입니다. 나는 오늘 그것을 시험 할 것이고 결과를 알려줄 것이다. 감사! – sebastien

    +0

    제안 된대로 C-Style 배열을 사용하여 코드의 일부를 업데이트했습니다. 결과는 아주 좋습니다. 내 테스트에는 38580 개의 개체가 있고 각각 24 개의 값이 있습니다. 최적화하기 전에 시간 프로파일 러의 측정을 기반으로 문자열을 분할하고, float을 구문 분석하고, NSNumber를 작성하고 NSArray에 NSNumber를 기록하는 작업은 3705ms 였고 최적화 후 1728ms였습니다. 또한 메모리 사용량이 향상되었지만 아직 측정하지 않았습니다. 감사합니다. – sebastien

    +1

    @ user951368 또한 문자열로 유지하려고 시도 할 수 있습니다 (즉, 분할 후 전환 없음). 일종의 테이블에 값을 표시하고 다중 액세스 패턴이있는 값 비싼 계산의 일부가 아닌 경우 셀 렌더링 콜백에서만 부동 소수점 및 형식으로 변환 할 수 있습니다. 런타임 페널티는 너무 작아 통지 할 수 없지만 이제는 전체적으로 변환 할 필요가 없습니다. –

    1

    나중에이 값을 어떻게 사용할 계획에 따라 다른 방법이 있습니다.

    1. 전체 부동 배열을 단일 NSValue로 저장합니다. 장점 : 건설 24 배 빠릅니다. 단점 : 모든 항목을 추출하여 그 중 일부 항목에 액세스해야합니다.
    2. 값을 문자열로 유지하십시오. 장점 : 낭비되는 시간이 없습니다. 단점 : 잦은 액세스는 시간을 낭비합니다.
    3. 단일 레코드를 유지하는 클래스를 디자인합니다. 하나의 NSString 및 24 개의 부동 속성입니다. 장점 : 단일 레코드가 모든 것을 통제합니다. 단점 : 단일 레코드가 모든 것을 통제합니다.

    UPD : 수동 24 필드 이름을 지정 불편을 생각하면 경우 3 value1 .. value24는, 클래스의 인터페이스 섹션에서 공공 배열을 선언 주시기 바랍니다. 이것은 레코드 객체의 출생과 C 스타일 배열을 결합합니다. 또한 해당 클래스에 -[valueAtIndex:]-[setValue:atIndex:] 메소드를 추가하고 실제 배열을 비공개로 설정할 수 있습니다.

    관련 문제