Tôi có tiện ích Python nằm trên một tệp tar.xz
và xử lý từng tệp riêng lẻ. Đây là tệp nén 15MB, với 740MB dữ liệu không nén.Rò rỉ đối tượng TarInfo
Trên một máy chủ cụ thể có bộ nhớ rất hạn chế, chương trình bị lỗi vì chương trình hết bộ nhớ. Tôi đã sử dụng objgraph để xem các đối tượng nào được tạo. Nó chỉ ra rằng các trường hợp TarInfo
không được phát hành. Vòng lặp chính là tương tự như sau:
with tarfile.open(...) as tar:
while True:
next = tar.next()
stream = tar.extractfile(next)
process_stream()
iter+=1
if not iter%1000:
objgraph.show_growth(limit=10)
Đầu ra là rất phù hợp:
TarInfo 2040 +1000
TarInfo 3040 +1000
TarInfo 4040 +1000
TarInfo 5040 +1000
TarInfo 6040 +1000
TarInfo 7040 +1000
TarInfo 8040 +1000
TarInfo 9040 +1000
TarInfo 10040 +1000
TarInfo 11040 +1000
TarInfo 12040 +1000
này tiếp tục cho đến khi tất cả 30.000 tập tin được xử lý.
Để đảm bảo, tôi đã nhận xét các dòng tạo luồng và xử lý luồng đó. Việc sử dụng bộ nhớ vẫn như cũ - Các cá thể TarInfo bị rò rỉ.
Tôi đang sử dụng Python 3.4.1 và hành vi này nhất quán trên Ubuntu, OS X và Windows.
Wow, tuyệt vời! Cảm ơn! – zmbq