2009-05-31 3 views
1

우리는 콘솔 게임을 출하하는 마지막 단계에 있습니다. Wii에서 우리는 메모리에 가장 많은 문제를 겪고 있습니다. 그래서 우리는 엉성한 코딩, 패킹 비트 등을 찾기 위해 바쁜 것입니다.큰 텍스트 파일에 대해 사전 검색을 실행하는 방법은 무엇입니까?

내가 메모리 덤프를 수행하고이를 분석 (시스 인 터널에서) strings.exe를 사용하지만,이 같은 빚을 많이 함께오고했습니다 내가 더 관심

''''$$$$ %%%% 
''''$$$$%%%%####&&&& 
''''$$$$((((!!!!$$$$''''((((####%%%%$$$$####((((
''))++.-$$%&'')) 
'')*>BZf8<S]^kgu[faniwkzgukzkzkz 
'',,..EDCCEEONNL 

wood_wide_end.bmp 
restroom_stonewall.bmp 

... 아직 ID로 변환해야하는 몇 가지 종류의 문자열이 포함되어 있음을 의미합니다.

내 질문은 : 우리가 제거 할 수있는 디버그 데이터 일 가능성이 높은 것들을 찾는 좋은 방법은 무엇입니까?

심볼을 해킹하거나 특정 종류의 문자열을 검색하기 위해 일부 rx를 사용할 수 있습니다. 하지만 내가 정말로하고 싶은 것은 표준 사전 파일을 가지고 그것에 대한 문자열 파일을 검색하는 것이다. aardvaark | alimony | archetype 등으로 큰 rx를 빌드하는 경우 속도가 느려집니다. .NET 컴파일 된 rx 어셈블리를 사용하면 충분합니다.

우리가 제거하고자하는 것들을 찾는 방법에 대한 다른 아이디어를 찾고 있습니다. 신속하고 더러운 솔루션, 우아한 필요가 없습니다. 감사!

+0

"wood_wide_end.bmp"를 20 바이트에서 4 비트로 압축하려고 할 때 메모리가 너무 빡빡합니까? 이 작품을 통해 얻을 수있는 이익의 정도와 도움이되는지에 대한 간단한 분석을 할 수 있습니다. – SPWorley

+0

개별 16 바이트를 절약하는 것은 가치가 없습니다. 그러나 우리가 한 레벨에 1000 개의 텍스처를 가지고 있고 그것들 각각이 그것이 참조 된 각 장소 (10K + 모델)의 복사본을 가지고 있다면 우리는 실제 기억을 말하고 있습니다. 우리가 할 수있는 메모리 최적화의 전체 클래스를 찾기 위해 문자열 분석을 사용하려고합니다. – scobi

+0

또한 ID를 4가 아닌 2 바이트 숫자로 만들 수 있습니다. – scobi

답변

1

먼저, 좋은 단어 목록을 얻습니다. This NPL page에는 다양한 크기와 소스의 단어 목록이 있습니다. 내가 할 수있는 것은 단어 목록의 모든 단어에 대한 해시 테이블을 작성한 다음 단어 목록에 대해 strings이 출력하는 각 단어를 테스트하는 것입니다.

import sys 

dictfile = open('your-word-list') 
wordlist = frozenset(word.strip() for word in dictfile) 
dictfile.close() 

for line in sys.stdin: 
    # if any word in the line is in our list, print out the whole line 
    for word in line.split(): 
     if word in wordlist: 
      print line 
      break 

다음과 같이 사용 :이 파이썬에서 할 매우 간단하지만

strings myexecutable.elf | python myscript.py 

, 당신이 잘못된 장소에 관심을 집중하고 생각합니다. 디버그 문자열을 제거하면 매우 적은 수익을 얻을 수 있습니다. 디버깅 데이터를 제거하는 것은 Nintendo에서 요구하는 기술 인증 요구 사항이지만, ELF에 몇 가지 추가 문자열이 있어도 바뀌지 않을 것이라고 생각합니다.

프로파일 러를 사용하여 가장 많은 메모리를 사용하고있는 곳을 확인하십시오. 적절한 장소에 에너지를 집중한다면 적은 노력으로 엄청난 양의 메모리를 절약 할 수있는 방법이있을 것입니다.

+0

나는 이것이 내가 찾은 것, 감사하다고 생각한다. 우리는 많은 부분에서 메모리 최적화를 찾고 있습니다. 이것은 쉽기 때문에 탐색하는 길 중 하나입니다. 우리는 지난 주에 게임 객체 이름을 제거했으며 mem의 K를 100으로 저장했습니다. 더 쉬운 승리를 원하지만 파일에있는 모든 소음으로 인해 어려움을 겪고 있습니다. – scobi

+0

당신의 시스템을 모르는 사이에, '쉽기 때문에'라는 표현은 술에 취한 사람들이 가로등 아래에서 잃어버린 열쇠를 찾고있는 오래된 농담을 연상시킵니다. 누군가가 도움을 청하고 열쇠가 떨어지는 곳을 묻는다면, 술고래는 거리의 다른 쪽을 가리 키지 만, 빛이 훨씬 쉽게이기 때문에 빛 아래에서보고 있습니다. 농담, 힘들지 마. 프로파일 링은 키가 떨어진 곳을 가리 킵니다. –

+0

좋은 농담이지만 ​​여기서는 적용 할 수 없습니다. 이 질문의 목적을 위해, 내가하고있는 일을 알고 있고 많은 게임에서 이런 종류의 일을했다고 가정 해 봅시다. 나는 진지하게 우리가 조사하고있는 잠재적 인 최적화의 큰 세트의 작은 부분으로서 문자열의 출력을 스캔하는 것에 관심이있다. – scobi

0

정규식을 지원하는 무언가에있는 빠르고 더러운 스크립트에 이상적인 작업처럼 들립니다. 나는 아마 파이썬에서 뭔가를 할 것입니다.

다음과 같이 진행하십시오. strings.exe 출력에서 ​​문자열을 발견 할 때마다 사전에 기억하거나 영구적으로 무시할 것인지 묻는 메시지가 나타납니다. 사용자가 문자열을 영구적으로 무시하도록 선택한 경우 나중에 해당 문자열이 표시 될 때 사용자에게이를 묻지 않고 버리십시오. 필요에 따라 사전 방지 파일을 보관하여 향후 스크립트 실행시이를 기억할 수 있습니다. 사전 파일을 빌드하고 각 문자열에 대해 원하는 정보를 포함 시키십시오. 선택 사항으로 문자열이 나오는 횟수를 기준으로 정렬하여 가장 불미스러운 범죄자에 집중할 수 있습니다.

이것은 스크립팅 언어를 배우기위한 이상적인 작업처럼 들립니다. 나는 이것을 구현하기 위해 C#/C++ 또는 진짜 멋진 것을 망칠 필요가 없다.

+0

uniq'd 문자열 출력이 멀티 메가임을 언급해야합니다. 문자열 단위 승인에 너무 많습니다. – scobi