2011-04-22 3 views
2

저는 Linux에서 Eclipse를 실행 중이며 Xdebug를 사용하여 프로그램을 최적화 할 수 있다고 들었습니다. 너무 오래 걸리는 스크립트에서 조합 알고리즘을 사용합니다.PHP 최적화 - 메모리 사용량 감소

저는 이것을 디버깅하기위한 시작점을 묻는 중입니다. 나는 기본 사항을 수행하는 법을 알고 있습니다 ... 점, 조건부 중단 점, 시작, 중지, 단계 등 ...하지만 고급 기술을 배우고 싶습니다. 그래서 더 나은 최적화 된 코드를 작성할 수 있습니다.

+1

분명히, 당신은 스크립트가 사용할 수있는 모든 128meg를 빨아 올리고 있습니다. 이 많은 데이터를 메모리에 저장해야하는 이유는 무엇입니까? 이 문제를 해결할 수있는 유일한 방법은 알고리즘의 저장소 요구 사항을 줄이거 나 메모리 제한을 높이는 것입니다. 당신이하고있는 일에 대한 세부 사항이 없이는 차고에 가서 "내 차가 고장났다. 고쳐라."라고 말하면서 어떻게 고장 났는지 말하는 것과 같다. –

+0

어떻게하면 128M을 늘릴 수 있습니까? 저는 조합 알고리즘, 특히 Chase 알고리즘 - http://www.netlib.no/netlib/toms/382를 사용하고 있습니다. nCk의 경우 n = 12 및 k = 3 인 경우 스크립트가 너무 많은 메모리를 사용합니다. –

+0

'ini_set ('memory_limit', NEW_VALUE)'입니다. new_value를 -1로 설정하면 제한이 제거되고, 그렇지 않으면 바이트로 제한됩니다. –

답변

5

첫 번째 단계는 점근 적 메모리 사용량을 계산하는 방법을 파악하는 것입니다. 즉, 문제가 커지면 메모리가 얼마나 커지는지를 알 수 있습니다. 이것은 하나의 재귀가 X 바이트 (X = 상수, 가장 쉬운 것은 1로 설정 됨)를 사용한다고 말함으로써 이루어집니다. 그런 다음 함수가 자신을 호출하는 방식이나 루프가 증가하는 양을 결론 짓는 등 반복을 적어 두십시오. (문제 크기, 선형 또는 그 이하로 이차 함수입니까?)

이것은 대학에서 기초 컴퓨터 과학 수업은 알고리즘이 얼마나 효과적인지 결론을 내릴 때 정말 유용합니다. 정확한 방법은 간단한 포럼 게시물에서 설명하기가 어렵 기 때문에 알고리즘에 관한 책을 가져 오는 것이 좋습니다 (Cormen, Leiserson, Rivest 및 Stein-MIT Press의 "Introduction to Algorithms"을 권합니다).

하지만이 유형의 작업에 대한 단서가없는 경우 get_memory_usage를 사용하고 루프/재귀에서 사용중인 메모리의 양을 반향하여 시작하십시오. 이것은 당신에게 문제가 있다는 암시를 줄 수 있습니다. 기억에 남는 물건의 양을 줄이십시오. 필요없는 모든 것을 버리십시오 (예를 들어 중간 값으로 낮추면 거대한 데이터 배열을 구축하지 마십시오).

+0

좋은 추측 . 디버깅을 위해 사용했던 중개 배열이 있었지만, 일단 메모리 제한에서 실행했지만 모든 가능한 솔루션을 계산할 때 실행 시간이 너무 느려서 디버깅에 사용되었습니다. 나는 Traveling Salesman 문제의 버전이라는 것을 깨달은 문제에 대한 최적화 된 조합 접근법이 존재한다는 것을 확신합니다. 의견을 보내 주셔서 감사합니다. –

+0

잘 했어! 문제의 이름을 아는 것은 많은 도움을 줄 것입니다. NP-hard 문제의 문제점은 해결하기가 어렵다는 것입니다. -/행운을 빌어! –