Tôi đang cố gắng gỡ lỗi một OutOfMemoryException
xảy ra khi tạo tệp ZIP
khá lớn bằng cách sử dụng System.IO.Packaging.ZipPackage
.OutOfMemoryException khi tạo tệp ZIP lớn bằng System.IO.Packaging
Mã đang lặp qua danh sách đối tượng lớn, thực hiện như sau cho từng đối tượng.
- Nối tiếp dữ liệu đối tượng vào tệp tạm thời.
- Tạo một
PackagePart
cho tệp. - Copy từ một nguồn
System.IO.Stream
khác: dòng- Nguồn:
FileStream
- Target dòng:
PackagePart::GetStream()
=>MS.Internal.IO.Zip.ZipIOModeEnforcingStream
- Nguồn:
Cuối cùng nó gọi Package::Close()
đó lưu file.
Sự cố tôi gặp phải là đối với một danh sách các đối tượng đặc biệt lớn, tôi thấy một số OutOfMemoryException
(kích thước quá trình x86 có kích thước khoảng 1,2 GB).
Tôi đã suy nghĩ về phân vùng dữ liệu đối tượng thành các đoạn vì vậy tôi chỉ xử lý một số tiền nhỏ hơn trên mỗi vòng lặp (tức là các bước 1-3 ở trên). Ý tưởng là tôi sẽ tạo n
tệp ZIP trong một thư mục tạm thời và sau đó tìm cách kết hợp chúng thành một tệp lưu trữ duy nhất.
Điều này có thể sử dụng System.IO.Packaging
không? Tôi sẽ sử dụng cái gì để kết hợp các bộ phận?
Hoặc có cách nào tốt hơn để khắc phục sự cố này không?
Hãy thử gọi Flush ở giữa lần lặp lại khi tạo gói mới – Ankur
@Ankur - bạn đã đóng đinh nó, điều đó dường như thực hiện thủ thuật. Nếu bạn nâng cấp nhận xét của mình lên câu trả lời, tôi sẽ sẵn lòng chấp nhận câu trả lời đó. – LeopardSkinPillBoxHat