2016-05-04 19 views
0

メモリストリームなしでファイルをzipファイルに保存する方法をお探しです。私の目標は最大のシステムメモリを節約することですが、ダイレクトディスクIOは問題ありません。 私はいくつかのブロブを収集したデータベースの結果セットを反復処理します。これらはバイト配列です。メモリストリームなしでファイルとZIPを生成

using (var archive = ZipFile.Open("data.zip", ZipArchiveMode.Update)) 
    { 
    foreach (var result in results) 
    { 
     string fileName = $"{result.Id}.bin"; 

     using (var fileStream = new FileStream(fileName, FileMode.Create, FileAccess.Write)) 
     { 
      // write the blob data from result.Value 
      fileStream.Write(result.Value, 0, result.Value.Length); 
      fileStream.Close(); 
     } 
     archive.CreateEntryFromFile(fileName, fileName); 
    } 
} 

この実装と2つの問題があります。私はそれが(System.IO.Compression)以下かどう

。私は私の* .binのファイルを持っている、もう1つは* .zipファイル(ZIPのみを必要とする)

  1. (私はなぜ知らないが、これは多くのRAMを使用しています〜15x1.5MBビンのための100メガバイトファイル)

完全にメモリをバイパスする方法はありますか?

UPDATE:

私が達成しようとしているどのようなデータベースの塊から生成された単一のバイナリファイルが含まれている1つのZIPファイルを生成することです。これは、ASP.NET Web APIコントローラ内で発生する必要があります。ユーザーはデータを要求できますが、HTTP応答でデータ全体を送信する代わりに、リクエスト時にZIPファイルを生成し、ローカルファイルサーバーに保存してユーザーにダウンロードリンクを送り返します。

+0

それはあなたが達成しようとしているものは不明だ - あなたは '... bin'でファイルを作成したくない場合は、なぜそのファイルを明示的に作成している新しい 'FileStream'を作成していますか? –

+0

これは、ILSPYを使用して通話を確認することによってCLRが実際に行っていることを確認するのに役立ちます。しかし私のために、あなたが達成しようとしていることを明確にしていません。 –

+0

@JonSkeet私はそれに一つのbinファイルを持つzipファイルが必要です。多分もっと洗練された解決策があるかもしれません(と私は願っています)。すべてのデータベース結果に対して単一のZipEntrieyオブジェクトを作成します。私はメモリ消費なしでそれを行う必要があります。したがって、ファイルシステム上にファイルを作成することは良いスタートだと思われます。さもなければ私はそれらを記憶にとどめなければならない。または私は間違っていますか? – marrrschine

答えて

0

私はあなたの> 100 MBが

  1. からforeachの範囲内の結果data.zipを開いたBLOBデータ
  2. の少なくとも15x1.5 MBに含まれている必要がありresultsオブジェクト来ると思います。ワーカープロセスのRAMの量を最小限に抑えるために

create empty zip-file 
do { 
(single BLOB query from DB) 
(write blob to new or overwrite File) 
(open zip file for append) 
(append file to zip) 
(close and dispose **both** file handles/objects) 
}