Производительность обработки 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 //}