Многопоточное сжатие файла - C#
Формулировка задачи:
Здравствуйте. Есть задача: при помощи System.IO.Compression.GZipStream сжимать файлы. Программа должна эффективно распараллеливать и синхронизировать задачи в многопроцессорной среде.
основной вопрос: как правильно распараллелить все это?
изначально я думал так:
1 поток - считывает файл поблочно в некий пул блоков
2 поток - записывает сжатые блоки в файл
оставшиеся берут блоки из первого пула, сжимают их, и кладут в пул с которым работает второй поток.
но при детальном рассмотрении было обнаружено, что GZipStream сжимает байты в stream. Т.е. по сути я могу сжимать сразу в fileStream выходного файла. однако, если несколько потоков буду одновременно сжимать, не факт, что блоки будут записаны по порядку. Если же сжимать в memoryStream, а потом писать через CopyTo в fileStream, то при разжатии получаю пустой файл. если сжимаю в memoryStream, который потом преобразую в byte[], который пишу в fileStream, при разжатии получаю ошибку "Неправильное магическое число в заголовке GZip"
после всего этого не могу придумать ничего, кроме как один поток читает файл, другой сжимает. Но это не походит на "эффективное распараллеливание задач в многопроцессорной среде". Подскажите, пожалуйста, как быть
Решение задачи: «Многопоточное сжатие файла»
textual
Листинг программы
using (MemoryStream output = new MemoryStream(dataArray[(int)i].Length)) { using (GZipStream cs = new GZipStream(output, CompressionMode.Compress)) { cs.Write(dataArray[(int)i], 0, dataArray[(int)i].Length); } compressedDataArray[(int)i] = output.ToArray(); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д