santhosepriya Ответов: 1

Производительность обработки zip-файла в памяти с помощью zip-архива


Привет Я использую Zip-архив[System. IO. Compression] для сбора множественного потока памяти xml и преобразования его в поток памяти zip, а затем отправляю на удаленный сервер [где я храню zip-файл].

Мое намерение не состоит в том, чтобы хранить какие-либо файлы[включая xml-файл,zip-файл] на локальном компьютере,
и не использовать какую-либо стороннюю библиотеку dll для сжатия.

Ниже код работает нормально и дает результат, как я и ожидал. Но все же я беспокоюсь о производительности[в production env мы получим больше записей в zip-хранилище]

пожалуйста, посоветуйте лучшее решение с точки зрения производительности и утечки памяти.

Что я уже пробовал:

Метод расширения для преобразования списка "любой объект"в XML
/// <summary>
       /// Get the List of T and serialize into XML Memeory stream
       /// </summary>
       /// <typeparam name="T"></typeparam>
       /// <param name="dataToSerialize"></param>
       /// <returns></returns>
       public static MemoryStream Serialize<T>(this T dataToSerialize)
       {
           try
           {
               if (dataToSerialize == null) throw new ArgumentNullException();
               var serializer = new XmlSerializer(dataToSerialize.GetType());
               MemoryStream memstream = new MemoryStream();
               serializer.Serialize(memstream, dataToSerialize);

               return memstream;

           }
           catch
           {
               throw;
           }

       }


Метод расширения для преобразования в поток zip-памяти из списка различных записей.
Входное значение типа dir["xmlfilename", List & lt;object data for xml conversion>]

/// <summary>
     /// Combine all file memory stream and convert into Zip memory stream
     /// </summary>
     /// <typeparam name="T"></typeparam>
     /// <param name="dataToSerialize"></param>
     /// <returns></returns>
     public static MemoryStream SerializeIntoZip<T>(this Dictionary<string,T> dataToSerialize)
     {
         var outStream = new MemoryStream();
         try
         {
             if (dataToSerialize == null) throw new ArgumentNullException();
             using (var archive = new ZipArchive(outStream, ZipArchiveMode.Create, true))
             {
                 foreach(var data in dataToSerialize)
                 {
                     var fileInArchive = archive.CreateEntry(data.Key, CompressionLevel.Optimal);
                     using (var entryStream = fileInArchive.Open())
                     {

                         using (var fileToCompressStream = data.Value.Serialize()) // Calling existing file stream method
                         {
                             entryStream.Flush();
                             fileToCompressStream.Seek(0, SeekOrigin.Begin);
                             fileToCompressStream.CopyTo(entryStream);
                             fileToCompressStream.Flush();
                         }
                     }
                 }

             }

             outStream.Seek(0, SeekOrigin.Begin);
             return outStream;
         }
         catch
         {

             throw;
         }


     }


Мой основной метод
Dictionary<string, IList> listofobj =
                new Dictionary<string, IList>() {
                   {"fileName_XX.xml", GetXXList1()}, 
                   {"fileName_YY.xml", GetYYList()}};

var mem = listofobj.SerializeIntoZip();

//{
// code to upload zip memory stream to S3 bucket
//}

1 Ответов

Рейтинг:
5

KarstenK

Обычно проблема на машинах заключается не в оперативной памяти, а в дисковом вводе-выводе, поэтому вы должны оптимизировать операции чтения и записи диска. Было бы разумно сделать поток ввода-вывода файлов и поток сжатия данных, чтобы обе операции не повредили производительности друг друга. Файловый ввод-вывод должен работать только с одним файлом за раз, он должен сначала записать один ожидающий, а затем прочитать один вперед. Поток памяти, чем получает сжимающий поток, и поток ввода-вывода может прочитать следующий файл. Для удаленной передачи некоторая буферизация очень полезна, но проверьте свободную память.

В лучшем случае вы делаете некоторые реалистичные тесты, чтобы найти некоторую оптимизацию. Например, если файлы меньше, чем чтение, сожмите и запишите кучу файлов во временную папку, чтобы передать их позже.