PHP가 메모리에 배열을로드하는 방식과 배열을 전달할 때 메모리를 사용하는 방식을 파악하려고합니다.PHP의 배열 메모리 사용량 관리는 어떻게 작동합니까?
그래서 코드 실행이 조금있어 : 입력 배열이 예에서 덜 중요 참고 :
이<?php
echo $this->getMemoryUsage();
$arr = $query->result_array(); // array of arrays from codeigniter
echo $this->getMemoryUsage();
이 메모리가 정확히 250 kB의 소비,이 배열은 대략 250 의미 kB 크기, 대략.
그래서 나는 다음과 같은 코드를 실행 :이 변경되면 내가 무엇을 읽고에 따르면<?php
echo $this->getMemoryUsage();
$arr = $query->result_array(); // array of arrays from codeigniter
$arr[0]['id'] = 'changing this value';
$foo = $arr;
$foo[2]['id'] = 'changing this value again';
$bar = $foo;
$bar[4]['id'] = 'changing this value again and again';
$far = $bar;
$far[5]['id'] = 'changing this value again and again and again';
echo $this->getMemoryUsage();
및 들었다, PHP 실제로 배열을 복사하지 않습니다, 그것은 단지 원래의 배열, 하지만를 참조 만든 PHP는 전체 배열을 복사해야합니다.
위의 코드가 정확히 500kB의 RAM을 소비 할 때 놀랍습니다.
여기에 무슨 일이 일어 났는지 설명 할 수 있습니까?
이러한 모든 인덱스 (0-5 및 id
)는 원래 배열에 이미 있으므로 값을 수정하고 있습니다. 원래 값은 정수입니다.
편집하는 것은
그냥()> 결과를 $ this-의 참여를 취소합니다; 여기에 내가 수행 한 다른 테스트입니다 :
echo $this->getMemoryUsage();
$arr = $query->result_array(); // array of arrays from codeigniter
//$arr[0]['id'] = 'changing this value';
$foo = $arr;
$foo[2]['id'] = 'changing this value again';
//$bar = $foo;
//$bar[4]['id'] = 'changing this value again and again';
//
//$far = $bar;
//$far[4]['id'] = 'changing this value again and again and again';
echo $this->getMemoryUsage();
출력이 정확히 250 KB입니다이 시간 - 그냥
요청으로편집 # 2
, 나는 '변경하지 않고 원래의 재판처럼 수 있도록, 내 설정에 여기에서 코드를 실행했습니다 확인 결과 일치 : http://pastebin.com/cYNg4cg7
이러한 결과는 다음과 같습니다
선언 : 4608 kB의
FINAL : 8904 kB의 선언에
DIFF : 4296 kB의
선언은 4608이고 배열은 여전히 메모리를 두 배 이상 만 이하의 통과와 4 번 바뀌었다 그래서 비록 발자국.
는는 I 메모리 각 할당 후 변경 실행 한 3
EDIT 번호 :
선언 : A0를 할당 5144 kB의
첨가 : A1 할당 144 킬로바이트
첨가 : 1,768 킬로바이트
A2 할당 : 1768 kB
할당 A3 추가 : 1768 kB
최종 : 10744 kB
신고하기까지의 차이 : 5600 kB
첫 번째 작업 이후의 다음 작업은 모두 정확히 동일하므로 정확히 같은 크기가 복사되고 있음을 나타냅니다. 이것은 오스틴의 대답을 뒷받침하는 것처럼 보입니다. 지금은 더할 수없는 유일한 것은 할당 된 크기입니다. 그러나 그것은 다른 질문입니다.
오스틴이 공을 쥐고있는 것처럼 보입니다. 다른 답변이없는 경우 받아 들일 것입니다. 당신이 말한대로
PHP 배열 쓰기 복사, 그러나 다차원 배열의 각 수준은 개별적으로 쓰기에 복사되어
: https : //로 nikic를 .github.io/2011/12/12/얼마나 대단한 PHP 배열인지 - 힌트 -BIG.html – Fleshgrinder
몇 주 전에이 기사를 읽었습니다. 솔직히 fasci입니다. 그러나, 복사가 정확히 어떻게 작동하는지 설명하지는 않습니다. – Patrick
알아, 그냥 네가 좋아할 거라 생각 했어. 귀하의 질문에 답변 할 수 없으며 귀하의 질문에 답변 할 수있는 링크를 드릴 수 없습니다. 대신 나는 당신의 질문에 별표를 붙여서 답변을 게시하지 않을 경우 현상금을 지불하고 현상금을 지급합니다. 알고 있기를 바랍니다. :) – Fleshgrinder