3

Я сжимал набор файлов размером 120 МБ с наилучшим сжатием, которое предлагает 7z, и заметил, что на пике он потребляет почти 600 МБ ОЗУ.

Почему эти программы сжатия используют так много оперативной памяти даже при работе с реально маленькими наборами данных, даже до такой степени, что они потребляют в несколько раз больше памяти, чем несжатый размер своего набора данных?

Просто любопытно, меня больше интересует техническая сторона.

2 ответа2

6

Технически никогда не был в сжатии, но давайте начнем поиск ...

В справочном файле 7z упоминается:

LZMA - это алгоритм, основанный на алгоритме Лемпеля-Зива. Он обеспечивает очень быструю декомпрессию (примерно в 10-20 раз быстрее, чем сжатие). Требования к памяти для сжатия и распаковки также различны (подробности см. В переключателе d = {Size} [b | k | m]).

(Обратите внимание, что в статье об алгоритме LZ в Википедии ничего не говорится о требовании к памяти.)

d = {Size} [b | k | m] Устанавливает размер словаря для LZMA. Вы должны указать размер в байтах, килобайтах или мегабайтах. Максимальное значение для размера словаря составляет 1 ГБ = 2 ^ 30 байт. Значения по умолчанию для LZMA: 24 (16 МБ) в обычном режиме, 25 (32 МБ) в максимальном режиме (-mx = 7) и 26 (64 МБ) в ультра-режиме (-mx = 9). Если вы не укажете какой-либо символ из набора [b | k | m], размер словаря будет рассчитываться как DictionarySize = 2 ^ Size bytes. Для распаковки файла, сжатого методом LZMA с размером словаря N, вам нужно около N байтов доступной памяти (RAM).

После википедии в дополнение к статье о словарных кодерах может показаться, что алгоритм работает путем сравнения данных, которые должны быть сжаты, с набором данных в "словаре", который должен быть основан на необработанных данных, которые должны быть сжаты.

Независимо от того, как построен этот словарь, поскольку он должен храниться в памяти, требование к ОЗУ является функцией этого словаря. А поскольку этот словарь не является необработанными данными, а представляет собой некоторую несжатую структуру данных, он будет (может) быть больше, чем необработанные данные, которые обрабатываются. Имеет смысл?

0

Если другой ответ слишком сложен для чтения, потому что в нем много технических терминов, я предлагаю свой ответ.

Файл хранится на жестком диске или твердом диске. Что за файл вы спрашиваете? Я отвечаю, куча единиц и нулей, расположенных в определенном порядке, который выглядит как файл снаружи. Что такое исполняемая программа *.exe? Это исполняемый код машинного кода, а также набор из 1 и 0. Он также хранится на вашем диске. Когда вы щелкаете по исполняемому файлу сжатия файлов, алгоритм инструкций кода загружается из *.exe на диске в ОЗУ. Только тогда он сможет бежать. ЦП компьютера запускает программы и читает / записывает данные. Он не может получить что-либо непосредственно с диска. Сначала он должен загрузить все в оперативную память, которая действует как посредник между процессором и диском, на котором хранятся все ваши данные.

Теперь программа сжатия файлов запускается процессором в оперативной памяти. Что инструкции кода говорят процессору делать? Они говорят ему загрузить сам файл с диска в оперативную память, чтобы программа могла с ним работать. Итак, теперь у нас есть две вещи в оперативной памяти: сама программа и файл.

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

Подумайте, как бы вы сжали свои документы. Сначала вы разложите их по всему столу, чтобы вы могли их видеть, а они упорядочили их по категориям и начали складывать бумаги в папки.

Итак, теперь у нас есть три вещи в оперативной памяти:1. Сама инструкция программы. 2. Исходный файл, который был загружен с диска. 3. Временная копия исходного файла, которая находится в состоянии, когда ее разбирают и собирают обратно. Может быть, в оперативной памяти сделано несколько временных копий всего файла или даже его частей, чтобы упростить для программы организацию и сжатие этого файла. Теперь вы видите, как программы сжатия файлов могут занимать гораздо больше оперативной памяти, когда они работают, по сравнению с размером исходного файла на диске?

Количество ОЗУ, использованное во время этого процесса, зависит от умения программиста, разработавшего приложение. Есть умные и эффективные способы написания кода, чтобы минимизировать потребление оперативной памяти. Кроме того, есть способы грубой силы для решения той же задачи, но она работает медленнее и занимает больше оперативной памяти. ОЗУ может быть даже потрачено впустую, если в программе есть утечка памяти. Представьте, что утечка памяти делает несколько копий одних и тех же данных, но затем оставляет их на столе и даже не удосуживается почистить себя.

В конце концов, хотя все временные копии будут сжаты в сжатую версию файла. Тем не менее, он все еще находится в оперативной памяти, поэтому сжатую версию файла необходимо отправить обратно на жесткий диск, где он будет сохранен на постоянной основе.

Основная идея заключается в том, что для достижения состояния с низкой энтропией вы должны временно пройти состояние с высокой энтропией. Это, конечно, написано в самых общих чертах.

Изображение ОЗУ внутри

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .