2016-05-04 3 views
0

Я ищу способ хранения файлов в zip-файле без потока памяти. Моя цель - сохранить максимум системной памяти, в то время как прямой диск IO не представляет проблемы. Я перебираю результирующий набор базы данных, где я собрал некоторые капли. Это байтовые массивы.Создание файлов и ZIP без потока памяти

Что я делаю это следующее (System.IO.Compression):

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 проблемы с этой реализации.

  1. У меня есть * .bin файлы и тот, * .zip (только нужен почтовый)
  2. Я не знаю, почему, но это использует много оперативной памяти (~ 100MB для 15x1.5MB бункером файлы)

Есть ли способ полностью обмануть память?

UPDATE:

То, что я пытаюсь добиться, чтобы сгенерировать один ZIP-файл, содержащий единичные двоичные файлы, сгенерированные из сгустков базы данных. Это должно произойти внутри контроллера веб-API ASP.NET. Пользователь может запросить данные, но вместо того, чтобы отправлять все данные в ответе HTTP, я генерирую ZIP-файл во время запроса, сохраняю его на локальном файловом сервере и отправляю ссылку загрузки пользователю.

+0

Неясно, что вы пытаетесь достичь - если вы не хотите, чтобы создать файл с '... bin', почему вы создаете новый «FileStream», который явно создает этот файл? –

+0

помогает проверить, что делает CLR, проверяя ваши звонки с помощью ILSPY. Но для меня не совсем понятно, чего вы пытаетесь достичь. –

+0

@JonSkeet Мне нужен zip-файл с отдельными файлами bin. Возможно (и я надеюсь) есть более элегантное решение, например. создание отдельных объектов ZipEntriey для каждого результата базы данных. Я должен делать это без потребления памяти. Поэтому создание файлов в файловой системе кажется хорошим началом. В противном случае я должен держать их в памяти. Или я ошибаюсь? – marrrschine

ответ

0

Я думаю, что ваши> 100 MBs исходя из

  1. в results объект, который должен содержать по крайней мере 15x1.5 МБ данных BLOB-
  2. держит полученный data.zip открытым внутри Еогеасп Scope.

минимизировать объем 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) 
} 
Смежные вопросы