Hướng dẫn garbage collector python stack overflow - bộ thu gom rác python ngăn xếp tràn

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

Hướng dẫn garbage collector python stack overflow - bộ thu gom rác python ngăn xếp tràn

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àng193 Huy hiệu bạc277 Huy hiệu đồng28 gold badges193 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.4512 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.3K14 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.9855 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àng29 Huy hiệu bạc29 Huy hiệu đồng2 gold badges29 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

Hướng dẫn garbage collector python stack overflow - bộ thu gom rác python ngăn xếp tràn

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 badges396 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

Có một người thu gom rác trong Python?

Bộ sưu tập rác Python có tổng cộng ba thế hệ và một đối tượng chuyển sang một thế hệ cũ bất cứ khi nào nó tồn tại trong quá trình thu thập rác trên thế hệ hiện tại của nó. Đối với mỗi thế hệ, mô -đun thu gom rác có số lượng đối tượng ngưỡng., and an object moves into an older generation whenever it survives a garbage collection process on its current generation. For each generation, the garbage collector module has a threshold number of objects.

Người thu gom rác có hoạt động trên ngăn xếp không?

Người thu gom rác, bởi bản chất của nó, chỉ xử lý đống được quản lý.Ngăn xếp không cần dọn dẹp vì nó được sử dụng lại tự động.Khi bạn nhập một chức năng mới, một "khung ngăn xếp" được xây dựng.Con trỏ ngăn xếp chỉ đơn giản được chuyển đến vị trí miễn phí đầu tiên trên ngăn xếp.. The stack doesn't need clean up because it's reused automatically. When you enter a new function, a "stack frame" is constructed. The stack pointer is simply moved forward to the first free location on the stack.

Người thu gom rác có nghĩa là gì trong Python?

Python xóa các đối tượng không mong muốn (các loại hoặc trường hợp lớp tích hợp) tự động để giải phóng không gian bộ nhớ.Quá trình mà Python định kỳ giải phóng và đòi lại các khối bộ nhớ không còn được sử dụng được gọi là bộ sưu tập rác.The process by which Python periodically frees and reclaims blocks of memory that no longer are in use is called Garbage Collection.

Ngăn xếp bộ sưu tập rác là gì?

Bộ sưu tập rác được phát minh để đối phó với vấn đề phân bổ mọi thứ trên một đống, tức là bạn không thể dự đoán phần nào sẽ được phát hành đầu tiên.GC có nghĩa là cho các vấn đề phân bổ bộ nhớ trong đó quản lý ngăn xếp là không đủ., i.e. such that you cannot predict which parts will be released first. GC is meant for memory allocation problems where stack management is not sufficient.