2011-10-21 30 views
6

を使用してかなり大きなZIPファイルを作成するときに発生するOutOfMemoryExceptionをデバッグしようとしています。System.IO.Packagingを使用して大きなZIPファイルを作成するときにOutOfMemoryExceptionが発生する

コードはオブジェクトの大きなリストを反復し、各オブジェクトに対して次のことを行います。

  1. オブジェクトデータを一時ファイルにシリアライズします。
  2. ファイルに対してPackagePartを作成しています。別のソースSystem.IO.Streamから
  3. コピー:
    • ソースストリーム:FileStream
    • ターゲットストリーム:PackagePart::GetStream() =>MS.Internal.IO.Zip.ZipIOModeEnforcingStream

最後に、それはファイルを保存しPackage::Close()を呼び出します。

私が抱えている問題は、特に大きなオブジェクトリストの場合、OutOfMemoryException(x86プロセスのサイズは約1.2GBになっています)です。

オブジェクトデータをまとめることを考えていたので、1ループあたりの処理量はわずかです(上記の手順1〜3)。私は、nのZIPファイルを一時ディレクトリに作成し、それらを1つのアーカイブに結合する方法を見つけることを考えています。

これはSystem.IO.Packagingを使用して可能ですか?部品を組み合わせるために私は何を使用しますか?

これを修正するより良い方法がありますか?

+0

新しいパッケージ – Ankur

+0

@Ankurを作成するときに、繰り返しの間にFlushを呼び出してみてください。@Ankur - あなたはそれを釘付けにしましたが、そのトリックをしたようです。あなたのコメントを回答にア​​ップグレードすると、私はそれを受け入れることを嬉しく思うでしょう。 – LeopardSkinPillBoxHat

答えて

3

新しいパッケージを作成する間に、パッケージオブジェクトに対してFlushメソッドを呼び出すと、メモリバッファがディスクにフラッシュされるため、問題が解決されるはずです。

+0

ありがとう - これは私のために働いた。私は、ZIPファイルに追加された500ファイルごとにそれをフラッシュしてしまいました。これはメモリとパフォーマンスとの間の良いトレードオフでした。 – LeopardSkinPillBoxHat

0

私はDotNetZipライブラリ(http://dotnetzip.codeplex.com/)を使用します。私はいくつかのzipライブラリ(現在使用しているようなSystem.IOとSharpZibLib)を試してきました。からまでは、DotNetZipライブラリが一番使いやすいです。

コードの行数が少なくて済み、メモリ使用量が非常に良好であることがわかりました(報告した仮想マシン環境で問題が発生し、新しいリリースが修正されました)。

+0

私のオリジナルの質問はそれほど明確ではありませんでしたが、これは実際には既存のコードの欠陥であり、このコードをあまり書き直したくない(私はちょうどクラッシュを修正したい)。これをもっと明確にするために質問を編集しました。 – LeopardSkinPillBoxHat

関連する問題