Tôi đang cố gắng tìm hiểu làm thế nào để PHP nạp mảng vào bộ nhớ và khi nào vượt qua một mảng tiêu thụ bộ nhớ.Quản lý sử dụng bộ nhớ mảng của PHP hoạt động như thế nào?
Vì vậy, tôi đã có chút này chút mã chạy: lưu ý rằng các mảng đầu vào là ít quan trọng trong ví dụ này:
<?php
echo $this->getMemoryUsage();
$arr = $query->result_array(); // array of arrays from codeigniter
echo $this->getMemoryUsage();
này tiêu thụ chính xác 250 kB bộ nhớ, điều này có nghĩa mảng là khoảng 250 kB có kích thước, khoảng.
Vì vậy, tôi chạy đoạn mã sau:
<?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();
Theo những gì tôi đọc và được cho biết, PHP không thực sự sao chép mảng, nó chỉ tham chiếu mảng ban đầu, nhưng một lần thay đổi là làm cho PHP phải sao chép toàn bộ mảng.
Hãy tưởng tượng sự ngạc nhiên của tôi khi mã trên tiêu thụ chính xác 500 kB RAM.
Có ai có thể giải thích những gì đang xảy ra ở đây không?
Chỉ cần rõ ràng, tất cả các chỉ mục này (0-5 và id
) đã tồn tại trong mảng ban đầu, tôi chỉ sửa đổi giá trị. Giá trị ban đầu là một số nguyên.
EDIT
Chỉ cần để xóa sự tham gia của $ this-> kết quả(); Dưới đây là một thử nghiệm tôi đã thực hiện:
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();
Lần này đầu ra là chính xác 250 kB - Cũng giống như các thử nghiệm ban đầu mà không cần bất kỳ thay đổi
EDIT # 2
Theo yêu cầu, tôi đã chạy mã từ đây trên thiết lập của tôi, để đảm bảo kết quả nhất quán: http://pastebin.com/cYNg4cg7
Đây là kết quả:
KÊ KHAI: 4608 kB
CUỐI CÙNG: 8904 kB
DIFF ĐỂ KÊ KHAI: 4296 kB
Vì vậy, mặc dù tuyên bố là 4608 và mảng đã được thông qua và thay đổi 4 lần, nó vẫn chỉ ít hơn gấp đôi bộ nhớ dấu chân.
EDIT # 3
Tôi đã chạy những thay đổi bộ nhớ sau mỗi lần phân bổ:
KÊ KHAI: 5144 kB
phân bổ A0 thêm: 144 kB
phân bổ A1 thêm: 1768 kB
phân bổ A2 được thêm vào: 1768 kB
phân bổ thêm A3: 1768 kB
CUỐI CÙNG: 10744 kB
DIFF TO DECLARATION: 5600 kB
Mỗi hoạt động sau đây sau khi chi phí đầu tiên giống hệt nhau, có vẻ như cho biết cùng một kích thước chính xác đang được sao chép. Điều này dường như để hỗ trợ câu trả lời của Austin, Điều duy nhất mà không thêm lên bây giờ là kích thước được phân bổ, Nhưng đó là một câu hỏi khác nhau.
Có vẻ như Austin đang chơi bóng, tôi sẽ chấp nhận nếu không có câu trả lời nào khác.
câu hỏi rất khó khăn, bạn có thể quan tâm đến các bài viết sau đây tôi đọc một vài ngày trước: https: // nikic .github.io/2011/12/12/Làm thế nào lớn-là-PHP-mảng-thực sự-Hint-BIG.html – Fleshgrinder
Tôi đã đọc bài viết đó một vài tuần trước đây, It's honestly fasci nating, Nhưng không giải thích cách sao chép hoạt động chính xác. – Patrick
Tôi biết, chỉ nghĩ rằng bạn có thể thích nó. Tôi không thể trả lời câu hỏi của bạn và tôi không thể cung cấp cho bạn liên kết có thể trả lời câu hỏi của bạn. Thay vào đó tôi đánh dấu sao câu hỏi của bạn để tôi có thể theo dõi nó và sẽ cho nó một tiền thưởng nếu không có câu trả lời được đăng, vì tôi cũng muốn biết điều này. :) – Fleshgrinder