2011-12-06 22 views
12

PHP memory_limit tôi là 64M (đó là khá cao để bắt đầu)PHP và Mông Cổ - findOne() gây mệt mỏi nhớ

Tôi có một MongoCollection :: findOne() được gọi trong mã PHP của tôi, nơi tôi "tìm thấy một "bởi MongoId. Nó hoạt động trong hầu hết các trường hợp. Tuy nhiên trong một số trường hợp, nó làm cho PHP đi qua memory_limit của 64M.

Bản ghi dữ liệu ở Mongo tối đa là 3,5MB vì ​​Mongo không cho phép nhiều hơn 4MB.

Khi tôi chạy, memory_get_usage() trước khi gọi findOne(), chỉ khoảng 4MB. Vì vậy, findOne() dường như đã tiêu thụ 60MB khác +. Đây có phải là rò rỉ bộ nhớ hay có lỗ hổng thiết kế theo cách tôi lưu trữ ở Mongo không?

tài xế của tôi PHP Mongo là mới nhất 1,26

+0

Bạn có cung cấp gì cho MongoCollection :: findOne() không? – ajreal

+0

có, được cung cấp "_id" –

+0

loại giá trị nào cho _id? – ajreal

Trả lời

1

Sẽ rất hữu ích nếu bạn có thể đăng mã chính xác mà bạn đang chạy. Nó rất có thể là mã của bạn, nhưng có khả năng nó có thể là một lỗi với trình điều khiển PHP Mongo. Phiên bản mới nhất của các trình điều khiển (1.2.9) có vẻ là một bước lùi từ các phiên bản trước.Bản thân tôi đã tìm thấy một lỗi trong trình điều khiển khiến php bị ngắt quãng trong thời gian chờ kết nối: o Trong cuộc trò chuyện mà tôi có với nhà phát triển 10gen, tôi đã tiết lộ rằng các trình điều khiển php ít nhất là trưởng thành của tất cả các ngôn ngữ, nhưng tôi đã nói rằng họ chỉ thuê một nhà phát triển php để các trình điều khiển sẽ sớm nhận được tình yêu.

1

Biết rằng Mongo ngước lên bởi băm chặt chẽ, và trình tự tra cứu đối với bất kỳ ID cho là có hạn, có là hoàn toàn không có cách nào điều này có thể được Mongo của làm.

Nếu bạn đang sử dụng MongoID thì bạn phải là chắc chắn rằng ID hợp lệ. Bởi vì MongoID là mã số được giải quyết cho bản ghi đã cho.

Đây có thể là vấn đề. Hoặc tôi có thể hoàn toàn sai.

1

Tôi không biết nhiều về trường hợp cụ thể của bạn; tuy nhiên, điều đó đã xảy ra với tôi một số lần sử dụng mysql và cakephp. Tôi đã không bao giờ được sử dụng mongo với php mặc dù. Hãy thử các cách sau:

A) Bạn đã thiết lập bất kỳ chỉ mục nào trong DB của mình chưa?
B) Bạn có thể tăng giới hạn bộ nhớ của mình thông qua php.ini, tôi thường đặt khoảng 256mb.
C) Nó có thể là trường hợp mà các hiệp hội của bạn đã gây ra một loạt các đối tượng được tạo ra. Tôi nghi ngờ truy vấn của bạn đang gây ra 60mb để lấp đầy, nhưng thay vì một số hỗn loạn đệ quy do các hiệp hội. Hãy thử liên kết unbinding trước khi gọi truy vấn của bạn.
D) Tắt tất cả các liên kết và từ từ làm việc theo cách của bạn.

Tôi biết mongo là nghĩa vụ phải loại bỏ sự cần thiết cho các truy vấn phức tạp. Có lẽ đây là vấn đề ngôn ngữ/thư viện nhiều hơn?

Hy vọng điều này sẽ hữu ích!

1

Hãy thử lệnh db.<your collection>.validate() trên bộ sưu tập tương ứng từ trình bao.
Hãy thử gọi số db.<your collection>.reIndex() trên bộ sưu tập.
Hãy thử xóa tất cả các chỉ mục và tạo lại chúng trên bộ sưu tập đó (ngay cả tất cả các bộ sưu tập; sẽ không làm tổn thương bất kỳ thứ gì).
Hãy thử db.repairDatabase() từ vỏ.

Ngoài ra, từ mã PHP của bạn, hãy thử các tiêu chí giống như tìm kiếm() và xem bạn có bị lỗi bộ nhớ hay không.

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