2011-10-21 1 views
6

을 사용하여 상당히 큰 ZIP 파일을 만들 때 발생하는 OutOfMemoryException을 디버깅하려고합니다.OutOfMemoryException System.IO.Packaging을 사용하여 큰 ZIP 파일을 만들 때

코드는 많은 개체 목록을 반복하면서 각 개체에 대해 다음을 수행합니다.

  1. 임시 파일에 개체 데이터를 직렬화합니다.
  2. 파일에 대해 PackagePart을 만듭니다. 다른 소스 System.IO.Stream에서
  3. 복사 :
    • 소스 스트림 : FileStream
    • 대상 스트림 :

PackagePart::GetStream() =>MS.Internal.IO.Zip.ZipIOModeEnforcingStream 는 마지막으로 파일을 저장 Package::Close()를 호출합니다.

내가 가지고있는 문제는 특별히 큰 개체 목록의 경우 OutOfMemoryException (x86 프로세스 크기가 약 1.2GB로 늘어남)입니다.

개체 데이터를 여러 조각으로 분할하여 루프 당 더 적은 양 (예 : 위의 1-3 단계) 만 처리하려고합니다. 아이디어는 n ZIP 파일을 임시 디렉토리에 만들고 단일 아카이브로 결합하는 방법을 찾는다는 것입니다.

System.IO.Packaging을 사용하면 가능합니까? 부품을 결합하려면 무엇을 사용해야합니까?

또는이 문제를 해결하는 더 좋은 방법이 있습니까?

+0

새 패키지 – Ankur

+0

@Ankur를 만들 때 반복 사이에 플러시 (Flush)를 호출하여 시도해보십시오. 의견을 답변으로 업그레이드하면 기꺼이 받아 들일 것입니다. – LeopardSkinPillBoxHat

답변

3

새 패키지를 만드는 사이에 Package 객체에 Flush 메서드를 호출하면 메모리 버퍼가 디스크로 플러시되는 문제가 해결 될 것입니다.

+0

고마워요.이게 저에게 효과적이었습니다. 나는 ZIP 파일에 추가 된 500 개의 파일들 사이에서 그것을 버려 버렸다. 이것은 메모리와 성능 간의 좋은 절충점이었습니다. – LeopardSkinPillBoxHat

0

DotNetZip 라이브러리 (http://dotnetzip.codeplex.com/)를 사용합니다. 나는 여러개의 zip 라이브러리 (현재 System.IO와 SharpZibLib를 사용하고있다.)와 까지까지 사용하기 가장 쉬운 DotNetZip 라이브러리를 시도했다.

거의 확실한 코드 줄로 끝나고 메모리 사용량이 매우 좋음을 알았습니다. (보고 한 가상 컴퓨터 환경에 문제가있어 새로운 릴리스가 수정되었습니다.)

+0

내 원래의 질문은 이것에 대해서는 명확하지 않지만, 이것은 실제로 기존 코드의 결함이며이 코드를 너무 많이 쓰지 않아도되고 싶지 않았습니다. (단지 충돌을 수정하고 싶습니다). 나는 이것을 더 명확하게하기 위해 질문을 편집했다. – LeopardSkinPillBoxHat