2010-12-04 5 views
0

나는 https://github.com/davedelong/CHCSVParserCHCSVParser의 메모리 사용을 어떻게 제한합니까?

그것은 설치 아주 쉬웠다 작품에서 CHCSVParser를 사용하여 코어 데이터로 30메가바이트의 CSV 파일을 가져 오기 위해 노력하고있어,하지만 파일을 구문 분석하는 것 같이 메모리를 많이 먹는다. 과도한 메모리 사용은 -substringWithRange:

//return nil to indicate EOF or error 
if ([currentChunk length] == 0) { return nil; } 

NSRange charRange = [currentChunk rangeOfComposedCharacterSequenceAtIndex:chunkIndex]; 
NSString * nextChar = [currentChunk substringWithRange:charRange]; 
chunkIndex = charRange.location + charRange.length; 
return nextChar; 
내가 -drain 모든 1,000,000 문자를 호출하는 함수에 오토 릴리즈 풀을 추가 할 수 있었다

하지만, 처리량, 통화, -nextCharacter의 끝에서 오는 특히 것 같다 내려 간다.

다른 아이디어가 있습니까? 아마도 Dave DeLong일까요? :-)

+0

주변 루프 및 자동 풀 풀의 코드를 조금 더 추가하십시오. –

+0

흥미 롭습니다! 좀 더 자세히 살펴보고 다시 생각해 보겠습니다. –

답변

1

괜찮 았어. 나는 네가 옳았는지 확인 했어. 뻔뻔스런 기억이 쌓여.

새로운 CSV 라인이 시작될 때마다 풀을 넣고 라인이 끝났을 때 배수를 시도했지만 다른 메모리 관리 상황에서는 효과가없는 것으로 나타났습니다.

내가 끝낸 것은 -runParseLoop 방법으로 풀을 넣는 것이 었습니다. 풀은 while 루프 바로 앞에 alloc '이고 오른쪽 직후에 배수됩니다. 이 루프의 증가는 누가 받 unsigned short 카운터, 그리고 루프 내에서, I -drain 다시 ALLOC 풀 카운터 적 0

기본적으로 안타 :

오버 플로우의 재미 착취의
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
unsigned short counter = 0; 
while (error == nil && 
     (currentCharacter = [self nextCharacter]) && 
     currentCharacter != nil) { 
    //process the current character 
    counter++; 
    if (counter == 0) { //this happens every 65,536 (2**16) iterations when the unsigned short overflows 
     //retain the characters that need to out-live this pool 
     [pool drain]; 
     pool = [[NSAutoreleasePool alloc] init]; 
     //autorelease the characters 
    } 
} 

[pool drain]; 

, 응? :)

이 파일을 190MB CSV 파일에 대해 테스트했는데 메모리 사용은 적절한 수준 (활성 메모리 2 메가 바이트)으로 유지되었습니다.

이러한 변경 사항은 github 페이지의 마스터 분기로 푸시되었습니다. 그들을 시도하고 그들이 당신을 위해 어떻게 작동하는지 알려주십시오. 메모리/성능 문제가 계속 발생하면 다시 방문하여 다른 것을 시도 할 수 있습니다.

+1

너무 많은 달 전에 대답 해줘서 고마워! 불행하게도 이것은 내 (많은) 버려진 프로젝트 중 하나였습니다. –

관련 문제