2012-06-15 28 views
6

Khi tôi tải tệp vào json, mức sử dụng bộ nhớ pythons tăng vọt lên khoảng 1.8 GB và dường như tôi không thể nhận được bộ nhớ đó. Tôi đặt cùng một trường hợp thử nghiệm đó là rất đơn giản:Sử dụng bộ nhớ lớn của mô-đun json của Python?

with open("test_file.json", 'r') as f: 
    j = json.load(f) 

Tôi xin lỗi mà tôi không thể cung cấp tệp json mẫu, tập tin thử nghiệm của tôi có rất nhiều thông tin nhạy cảm, nhưng đối với bối cảnh, tôi đang đối phó với một tập tin theo thứ tự 240MB. Sau khi chạy 2 dòng trên, tôi đã sử dụng bộ nhớ 1.8GB đã đề cập trước đó. Nếu sau đó tôi thực hiện việc sử dụng bộ nhớ del j sẽ không giảm chút nào. Nếu tôi làm theo điều đó với một số gc.collect() nó vẫn không giảm. Tôi thậm chí đã cố gắng dỡ bỏ các mô-đun json và chạy một gc.collect.

Tôi đang cố gắng chạy một số hồ sơ bộ nhớ nhưng heapy đã khuấy động 100% CPU trong khoảng một giờ và chưa tạo ra bất kỳ đầu ra nào.

Có ai có ý tưởng nào không? Tôi cũng đã thử sử dụng cjson ở trên thay vì mô-đun json đóng gói. cjson sử dụng khoảng 30% bộ nhớ ít hơn nhưng nếu không hiển thị chính xác cùng một vấn đề.

Tôi đang chạy Python 2.7.2 trên máy chủ Ubuntu 11.10.

Tôi rất vui khi tải lên bất kỳ trình thu thập bộ nhớ nào và xem liệu nó có tốt hơn sau đó heapy và cung cấp bất kỳ chẩn đoán bạn có thể nghĩ là cần thiết. Tôi đang tìm kiếm một tệp json thử nghiệm lớn mà tôi có thể cung cấp cho bất kỳ ai khác để cho nó đi.

+0

Hãy dùng thử với một tệp khác. Bạn đang chạy phiên tương tác hoặc tập lệnh python? Cả hai có hiển thị cùng một vấn đề không? – heltonbiker

+0

Liên quan: http://stackoverflow.com/questions/2400643/is-there-a-memory-efficient-and-fast-way-to-load-big-json-files-in-python – ChristopheD

+0

@ChristopheD Vấn đề của tôi là với bộ nhớ không bao giờ được phát hành. Tôi không quan tâm nhiều đến mức nhiều bộ nhớ được sử dụng trong quá trình phân tích cú pháp. – Endophage

Trả lời

13

Tôi nghĩ rằng hai liên kết này giải quyết một số điểm thú vị về vấn đề này không nhất thiết phải là một vấn đề json, nhưng thay vì chỉ là một "đối tượng lớn" vấn đề và làm thế nào bộ nhớ làm việc với python vs hệ điều hành

Xem Why doesn't Python release the memory when I delete a large object? cho bộ nhớ lý do tại sao phát hành từ python không nhất thiết phải được phản ánh bởi hệ điều hành:

Nếu bạn tạo một đối tượng lớn và xóa nó một lần nữa, Python có thể đã giải phóng bộ nhớ, nhưng bộ nhớ cấp phát không nhất thiết phải trả bộ nhớ cho hệ điều hành, vì vậy nó có thể trông giống như quá trình Python sử dụng nhiều bộ nhớ ảo hơn nó thực sự sử dụng.

Về running large object processes in a subprocess để cho các thỏa thuận OS với dọn dẹp:

Cách duy nhất thực sự đáng tin cậy để đảm bảo rằng việc sử dụng lớn nhưng tạm thời của bộ nhớ KHÔNG trả lại tất cả các nguồn lực để hệ thống khi nó được thực hiện, là để có sử dụng đó xảy ra trong một tiến trình con, mà công việc đói bộ nhớ sau đó chấm dứt. Trong những điều kiện như vậy, hệ điều hành S W thực hiện công việc của mình và sẵn sàng tái chế tất cả các tài nguyên mà quy trình con có thể đã gobbled lên. May thay, mô đun đa xử lý làm cho loại hoạt động này (vốn thường là một nỗi đau) không quá tệ trong các phiên bản Python hiện đại.

+1

Hãy đảm bảo bao gồm các trích đoạn/ví dụ có liên quan để chống lại bản chất không ổn định của dữ liệu trên internet :) –

+0

@pst: Cảm ơn! Tôi đánh giá cao việc bạn thêm điều đó. – jdi

+0

Rất bực bội. Có vẻ như đoạn mã đầu tiên của bạn mô tả chính xác tình huống. – Endophage

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