2010-07-08 11 views

답변

3

나는 당신의 질문을 어떻게 읽었는지에 따라, 나는 PHP로 틀린 나무를 짖고 있다고 생각한다. 낮은 메모리 오버 헤드를 위해 설계된 적이 없었습니다.

가능한 한 효율적 이길 원한다면 다른 답변을보십시오. 모든 단일 변수에는 상당한 메모리가 필요하므로 기억해야하는 것만 사용해야하며 가비지 수집기가 작동하도록하십시오. 프로그램이 해당 범위를 벗어날 때 GC'd를 얻을 수 있도록 변수를 로컬 범위에서만 선언해야합니다. 객체는 스칼라 변수보다 비쌉니다. 그러나 내가 보는 가장 큰 공통적 인 학대는 여러 데이터 사본입니다. 배열이 큰 경우 operate directly on it rather than copying it (CPU 효율은 낮지 만 메모리 효율은 높아야 함).

메모리가 부족한 환경에서 실행하려면 다른 언어를 사용하는 것이 좋습니다. PHP는 변수와 관련하여 모든 것을 관리하기 때문에 좋습니다. 그러나 이러한 유형의 조정 및 유연성은 가격 (속도 및 메모리 사용량)에 달려 있습니다. 각 변수에는 많은 메타 데이터가 저장되어 있어야합니다. 따라서 8 바이트 int (32 비트)는 C에서 저장하기 위해 8 바이트를 취할 것이며, PHP에서 64 바이트 이상을 차지할 것입니다 (유형, 이름, 범위 지정 정보 등과 같은 모든 "추적 정보" 기타). 이 오버 헤드는 PHP가 대용량 메모리로드를 위해 설계되지 않았기 때문에 일반적으로 ok로 간주됩니다. 따라서 그것은 절충점입니다. 쉬운 프로그래밍에 더 많은 메모리가 사용됩니다.그러나 메모리 제약 조건이 빡빡하다면 다른 언어로 이동하는 것이 좋습니다 ...

0

당신이하려고하는 것과 메모리 사용이 왜 문제가되는지에 대한 정보가 거의 없기 때문에 조언하기가 어렵습니다. 일반적인 시나리오 (많은 요청을 처리하는 웹 서버)에서 메모리는 제한적인 공장이 아니므로 속도를 위해 메모리를 희생한다고하더라도 가능한 한 빨리 요청을 처리하는 것이 좋습니다.

그러나, 다음과 같은 일반적인 지침이 적용

  • unset 당신의 변수를 즉시 당신이 그들을 필요로하지 않는. 잘 작성된 프로그램에서는 범위를 벗어나는 변수가 동일한 효과를 갖기 때문에 이것이 큰 영향을 미치지는 않습니다.
  • 순환 참조가있는 많은 변수가있는 장기 실행 스크립트 및 PHP 5.3을 사용하는 경우 특정 시점에서 가비지 수집기를 명시 적으로 호출합니다.
0

우선 : 참조를 사용하여 메모리 사용을 최적화하지 마십시오. 당신이 그것에 쓸 때

$array = array(1,2,3,4,5,); 
$var = $array; 

PHP는 변수의 내용을 복사합니다 : PHP는이 같은 일을 할 경우 변수의 내용을 복사 않을만큼 똑똑하다.)

그러나 나는 당신의 질문이 당신이 더 정확하다면 대답하기가 어렵다고 생각합니다.

예를 들어 파일 작업을하는 경우 파일 전체를 file_get_contents()으로 항상 지정할 필요는 없지만 f (open | ...) 함수를 사용하여 파일의 작은 부분 만 한 번에로드하거나 전체를 건너 뛰기도 할 수 있습니다 덩어리.

또는 문자열로 작업하는 경우 가능한 경우 나머지 문자열 대신 문자열 오프셋 (예 : strpbrk 대신 strcspn)을 반환하는 함수를 사용합니다.

관련 문제