import json
import time
from itertools import count
def keygen(size):
for i in count(1):
s = str(i)
yield '0' * (size - len(s)) + str(s)
def jsontest(num):
keys = keygen(20)
kvjson = json.dumps(dict((keys.next(), '0' * 200) for i in range(num)))
kvpairs = json.loads(kvjson)
del kvpairs # Not required. Just to check if it makes any difference
print 'load completed'
jsontest(500000)
while 1:
time.sleep(1)
top cho biết rằng quá trình python chứa ~ 450Mb RAM sau khi hoàn thành chức năng 'jsontest'. Nếu cuộc gọi tới 'json.loads' bị bỏ qua thì vấn đề này không được quan sát. A gc.collect sau khi thực hiện chức năng này sẽ giải phóng bộ nhớ.Nêu nhớ bộ nhớ json của Python
Có vẻ như bộ nhớ không được giữ trong bất kỳ bộ nhớ đệm hoặc bộ cấp phát bộ nhớ trong của python như lời gọi rõ ràng tới gc.collect đang giải phóng bộ nhớ.
Điều này có xảy ra do ngưỡng thu gom rác thải (700, 10, 10) chưa bao giờ đạt được?
Tôi đã đặt một số mã sau jsontest để mô phỏng ngưỡng. Nhưng nó không giúp được gì.
Thậm chí nếu chúng tôi gọi jsontest nhiều lần, bộ nhớ vẫn ở mức ~ 450MB. Đây có phải là bộ nhớ được sử dụng bởi cuộc gọi jsontest cuối cùng? Mã này là một phần của webapp xử lý các thông điệp json. Ngay cả sau khi chạy webapp trong một giờ, bộ nhớ dường như không được phát hành. Có cách giải quyết nào khác ngoài gc.collect không? – Anoop
Thử in 'gc.get_count()' sau mỗi cuộc gọi thành 'jsontest' và tất cả sẽ rõ ràng. Ngoài ra, có gì sai khi gọi 'gc.collect'? –