42
Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.
Tôi đã tạo một số mã Python tạo ra một đối tượng trong một vòng lặp và trong mỗi lần lặp lại ghi đè lên đối tượng này với một loại mới cùng loại. Điều này được thực hiện 10.000 lần và Python chiếm 7MB bộ nhớ mỗi giây cho đến khi RAM 3GB của tôi được sử dụng. Có ai biết cách loại bỏ các đối tượng khỏi bộ nhớ không?
Đã hỏi ngày 23 tháng 6 năm 2009 lúc 21:59Jun 23, 2009 at 21:59
1
Tôi nghĩ rằng đây là tài liệu tham khảo tròn [mặc dù câu hỏi không rõ ràng về thông tin này.]
Một cách để giải quyết vấn đề này là gọi thủ công bộ sưu tập rác. Khi bạn chạy thủ công Trình thu gom rác, nó cũng sẽ quét các đối tượng tham chiếu tròn.
import gc
for i in xrange[10000]:
j = myObj[]
processObj[j]
#assuming count reference is not zero but still
#object won't remain usable after the iteration
if ![i%100]:
gc.collect[]
Ở đây đừng chạy bộ sưu tập rác quá thường xuyên vì nó có chi phí riêng, ví dụ: Nếu bạn chạy bộ thu gom rác trong mỗi vòng lặp, việc giải thích sẽ trở nên cực kỳ chậm.
Bjorn Pollex
73.6K28 Huy hiệu vàng192 Huy hiệu bạc277 Huy hiệu đồng28 gold badges192 silver badges277 bronze badges
Đã trả lời ngày 30 tháng 10 năm 2010 lúc 21:37Oct 30, 2010 at 21:37
Hasanatkazmihasanatkazmihasanatkazmi
7.4212 Huy hiệu vàng21 Huy hiệu bạc18 Huy hiệu đồng2 gold badges21 silver badges18 bronze badges
0
Bạn chưa cung cấp đủ thông tin - điều này phụ thuộc vào các chi tiết cụ thể của đối tượng bạn đang tạo và những gì bạn đang làm với nó trong vòng lặp. Nếu đối tượng không tạo ra các tài liệu tham khảo tròn, nó sẽ được giải quyết trên lần lặp tiếp theo. Ví dụ: mã
for x in range[100000]:
obj = " " * 10000000
sẽ không dẫn đến phân bổ bộ nhớ ngày càng tăng.
Đã trả lời ngày 23 tháng 6 năm 2009 lúc 22:07Jun 23, 2009 at 22:07
Vinay Sajipvinay SajipVinay Sajip
92.2K14 Huy hiệu vàng173 Huy hiệu bạc182 Huy hiệu đồng14 gold badges173 silver badges182 bronze badges
3
Đây là một lỗi cũ đã được sửa cho một số loại trong Python 2.5. Điều đang xảy ra là Python không giỏi trong việc thu thập những thứ như danh sách trống/từ điển/tupes/floats/ints. Trong Python 2.5, điều này đã được cố định ... chủ yếu. Tuy nhiên, Floats và INT là những người độc thân để so sánh, vì vậy một khi một trong số đó được tạo ra, nó vẫn tồn tại miễn là thông dịch viên còn sống. Tôi đã bị cắn bởi điều tồi tệ nhất này khi đối phó với một lượng lớn phao vì chúng có thói quen khó chịu là duy nhất. Điều này được đặc trưng cho Python 2.4 và được cập nhật về việc nó được gấp lại thành Python 2.5
Cách tốt nhất tôi tìm thấy xung quanh nó là nâng cấp lên Python 2.5 hoặc mới hơn để chăm sóc các danh sách/từ điển/bài viết. Đối với các con số, giải pháp duy nhất là không để số lượng lớn các số vào Python. Tôi đã thực hiện nó với trình bao bọc của riêng mình với một đối tượng C ++, nhưng tôi có ấn tượng rằng Numpy.Array sẽ cho kết quả tương tự.
Là một kịch bản bài viết, tôi không biết chuyện gì đã xảy ra với điều này trong Python 3, nhưng tôi nghi ngờ rằng những con số vẫn là một phần của singleton. Vì vậy, rò rỉ bộ nhớ thực sự là một tính năng của ngôn ngữ.
Đã trả lời ngày 23 tháng 6 năm 2009 lúc 22:11Jun 23, 2009 at 22:11
2
Nếu bạn đang tạo các tài liệu tham khảo tròn, các đối tượng của bạn sẽ không được giải quyết ngay lập tức, nhưng phải chờ một chu kỳ GC chạy.
Bạn có thể sử dụng mô -đun yếu để giải quyết vấn đề này hoặc rõ ràng xóa các đối tượng của bạn sau khi sử dụng.
Peter Szabo
1.0162 Huy hiệu vàng16 Huy hiệu bạc29 Huy hiệu đồng2 gold badges16 silver badges29 bronze badges
Đã trả lời ngày 24 tháng 6 năm 2009 lúc 1:28Jun 24, 2009 at 1:28
AlgoriasalgoriasAlgorias
2.9755 Huy hiệu vàng21 Huy hiệu bạc16 Huy hiệu Đồng5 gold badges21 silver badges16 bronze badges
0
Tôi thấy rằng trong trường hợp của tôi [với Python 2.5.1], với các tài liệu tham khảo tròn liên quan đến các lớp có phương pháp __del__[]
, không chỉ thu thập rác không chỉ xảy ra kịch bản thoát ra. Vì vậy, tôi đã sử dụng yếu để phá vỡ các tài liệu tham khảo tròn và tất cả đều tốt.
Kudos cho Miles, người đã cung cấp tất cả thông tin trong các bình luận của anh ấy để tôi đặt điều này lại với nhau.
Đã trả lời ngày 10 tháng 1 năm 2010 lúc 16:30Jan 10, 2010 at 16:30
VonvonVon
4.2972 Huy hiệu vàng28 Huy hiệu bạc29 Huy hiệu đồng2 gold badges28 silver badges29 bronze badges
1
Đây là một điều bạn có thể làm tại bản phát hành để buộc một biến số của một biến:
>>> x = 5
>>> x
5
>>> del x
>>> x
Traceback [most recent call last]:
File "", line 1, in
NameError: name 'x' is not defined
Đã trả lời ngày 23 tháng 6 năm 2009 lúc 22:11Jun 23, 2009 at 22:11
Nếu bạn đang tạo các tài liệu tham khảo tròn, các đối tượng của bạn sẽ không được giải quyết ngay lập tức, nhưng phải chờ một chu kỳ GC chạy.Mark Rushakoff
Bạn có thể sử dụng mô -đun yếu để giải quyết vấn đề này hoặc rõ ràng xóa các đối tượng của bạn sau khi sử dụng.44 gold badges402 silver badges395 bronze badges
1
Peter Szabo
1.0162 Huy hiệu vàng16 Huy hiệu bạc29 Huy hiệu đồngMay 8, 2018 at 18:51