2012-08-11 31 views
8

Hiện tại, ứng dụng của tôi sử dụng bộ nhớ khoảng 7 MB.Mảng lớn chiếm nhiều không gian bộ nhớ hơn

Mảng xuất hiện để sử dụng 700 KB nếu tôi kiểm tra kích thước với strlen(serialize($array)))).

  • Nếu sử dụng mảng này trong ứng dụng của tôi và kiểm tra mức sử dụng bộ nhớ (với memory_get_peak_usage()) Tôi nhận được 14 MB.

  • Nếu tôi không sử dụng, tôi nhận được 7 MB.

Nếu mảng này mất 700 KB theo thứ tự, tại sao PHP cần 7 MB cho biến này? Hay tôi đang làm điểm chuẩn sai?

+1

Có gì trong mảng/đối tượng này? Đại diện cho các đối tượng thực sự trong bộ nhớ có thể mất nhiều phân bổ hơn là cần thiết cho một phiên bản văn bản. – Brad

+0

Một bảng gồm tất cả các ký tự utf8 và các ký tự ASCII tương đương. Ok, nhưng gấp 10 lần ?? – ellabeauty

+1

Nếu bạn sử dụng 'memory_get_usage' thì sao? 'memory_get_peak_usage' cho bạn thấy cách sử dụng' peak' là – zerkms

Trả lời

10

Bạn muốn tránh xa PHP nếu điều này làm phiền bạn: http://nikic.github.com/2011/12/12/How-big-are-PHP-arrays-really-Hint-BIG.html. PHP mảng giống như một số không gian sống.

Khi có thể, bạn có thể sử dụng SplFixedArray, nhưng sau đó lại một lần nữa, người quan tâm đến khoảng trống mà mảng PHP mất. Nếu bạn đang tìm kiếm các công cụ sạch/hiệu suất tại sao bạn sử dụng PHP ngay từ đầu (có điều này đến từ một chàng PHP) :)

+1

@ brad tnx! Tôi cần những người như bạn khi trả lời các câu hỏi vào tối thứ Bảy: D – PeeHaa

+0

cảm ơn tôi sẽ cố chuyển đổi mảng của tôi thành "SplFixedArray", nhưng sẽ mất nhiều thời gian :) – ellabeauty

+2

@Petra, Không sao cả! Bây giờ chúng ta chỉ cần một trò chơi uống StackOverflow ... – Brad

1

Các định dạng tuần tự có thể tối ưu hóa bộ nhớ vì chúng không cần có đối tượng tồn tại trong bộ nhớ và có khả năng truy cập hoàn toàn. Họ chỉ giữ tính toàn vẹn của dữ liệu, không phải là khả năng truy cập. Nếu điều này giúp trả lời câu hỏi của bạn một chút.

Các vấn đề liên quan