Многопоточное сжатие файла - 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();
            }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.133 из 5
Похожие ответы