2011-10-21 10 views
6

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.

  1. Nối tiếp dữ liệu đối tượng vào tệp tạm thời.
  2. Tạo một PackagePart cho tệp.
  3. 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

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?

+0

Hãy thử gọi Flush ở giữa lần lặp lại khi tạo gói mới – Ankur

+0

@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

Trả lời

3

Gọi phương thức Flush trên đối tượng Gói ở giữa việc tạo gói mới có thể giải quyết được sự cố vì điều đó sẽ khiến bộ nhớ đệm được chuyển sang đĩa.

+0

Cảm ơn - điều này đã hiệu quả đối với tôi. Tôi đã kết thúc việc xóa nó giữa 500 tệp đã được thêm vào tệp ZIP. Đây là một sự cân bằng tốt giữa trí nhớ và hiệu suất. – LeopardSkinPillBoxHat

0

Tôi sẽ sử dụng thư viện DotNetZip (http://dotnetzip.codeplex.com/). Tôi đã thử một số thư viện zip (System.IO như bạn hiện đang sử dụng và cũng là SharpZibLib) và bởi xa dễ sử dụng nhất là thư viện DotNetZip.

Bạn hầu như sẽ kết thúc với ít dòng mã hơn và tôi thấy việc sử dụng bộ nhớ rất tốt (có vấn đề trong môi trường máy ảo mà tôi đã báo cáo và bản phát hành mới đã sửa).

+0

Câu hỏi ban đầu của tôi không rõ ràng về điều này, nhưng đây thực sự là lỗi trong mã hiện tại và tôi không muốn phải viết lại mã này quá nhiều (tôi chỉ muốn sửa lỗi). Tôi đã chỉnh sửa câu hỏi để làm rõ hơn. – LeopardSkinPillBoxHat