Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 52 • Страница 1 из 31  2  3  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 01.06.2003
Откуда: Pskov
Суть проблемы в следующем. Требуется пожать несколько папок, содержимое которых совпадает между собою, допустим на ~70%, или даже на 99,9%. К примеру, 3 папки с названиями Folder1, Folder2, Folder3 содержат бакапы винды, сделанные с промежутком в 1-2 дня. Но это лишь частный пример для более ясного понимания.

Если сжать их все сразу (Foler1+Foler2+Foler3), то получившийся архив будет в ~3 раза больше архива, полученного после сжатия одной (например, Folder1) из этих трех папок. Я специально проводил эксперимент с ВинРаром 3.30 -- это действительно так :-(

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

Поскольку сами архиваторы (по крайней мере, WinRAR) не способны справиться с такой задачей, то придется написать предархиватор, который исправит ситуацию.

Алгоритм его действия:

  1. Создать полный список архивируемых файлов.
  2. Сравнить все файлы одинаковых размеров между собой.
    Из нескольких одинаковых файлов оставлять лишь один, остальные стирать, а их полный путь занести в список дубликатов.
  3. На основе списка дублей создать "распаковщик" (для начала достаточно обычный .bat-ник), который сможет восстановить первоначальное содержимое папок.
Затем на обработанные "предархиватором" папки можно натравить обычный архиватор -- итоговый архив будет В РАЗЫ меньше, чем без этапа предупаковки. Лучше его сделать SFX, чтобы он сам запускал распаковщик (.bat) после разархивирования.

Разница в итоговых размерах архивов с и без предархивации будет пропорциональна проценту дубликатов.

Думаю, мне самому по силам написать такую тулзу, но результат будет нескорым, скорее всего консольным и не очень надежным :-)

Так что обращаюсь к общественности: кто возьмется ?

Возможно, упаковщики такого назначения уже существуют. Тем лучше :) Вполне вероятно, что под линух/юниксы существует и не такое, но под винду мне, к сожалению, ничего подобного до сих пор на глаза не попадалось...

Поправьте меня, если где соврал.

PS: Подумалость тут:
  1. Полученный архив лучше сразу залочить, чтобы избежать удаления ключевых файлов. Именно по этой причине лучше ввести функцию подобной предархивации в сами архиваторы. Может стоит написать Рошалю и автору 7-zip ? :wink:
  2. Вроде бы некоторые архиваторы не любили работать с пустыми папками и просто их не архивировали или наоборот не создавали при разархивировании -- придется в распаковщике ввести контроль за существованием папок назначения.
  3. Достаточно не удалять дубликаты, а просто не включать их в список для архивации. Этот список можно было бы подсунуть архиватору -- многие архиваторы умеют работать по ним. В список главное не забыть включить сам распаковщик (.bat) :)


Добавлено спустя 10 минут, 1 секунду:
Ситуацию немного скрашивает solid-архивирование в WinRAR'е. Но только при условии, что размер файла в несколько раз меньше окна архивирования (словаря). А оно, как известно, ограничено в 4096 Kb.

_________________
ПС: [13-06-2006] Идеальный скриншот BIOS'а ? Запросто ! // K.V.



Партнер
 

member+
Статус: Не в сети
Регистрация: 16.01.2004
Откуда: Estonia,Tallinn
Цитата:
должен быть практически равен размеру архива с одной папкой -- ведь повтояющиеся файлы вовсе необязательно архивировать трижды

А стоит файлу отличиться на один байт, и весь смысл рухнет, никакой экогомии и лишьний программный код (читай скорость и надёжность)

(Я мог бы такое написать на QBasic'e, Спектрумском Basic'e, Ассемблере(Z80), вкрайнем случае на мог но не стал на Ассемблере 80286 но боюсь что это тебе не поможет...)

_________________
X99-TF/E5-2678v3+Evo212/2x16Gb-DDR4-Gloway-TYPE-a@2133-12-13-13-26/GTX1070TI/KINGSTON-SNV2S1000G


 

Member
Статус: Не в сети
Регистрация: 01.06.2003
Откуда: Pskov
Дык, эту опцию можно, как и solid-архивирование, включать по желанию пользователя, которое будет зависеть от конкретных обстоятельств. Если мне, допустим, надо заархивировать несколько папок с теми же бакапами винды, в которых ~40%..90% файлов повторяется, то очевидно, что мне выгоднее включить эту опцию. Пусть даже это займет немногим больше времени, зато в итоге окупится гораздо меньшим размером архива.

А насчет всяких тонкостей, типа "А стоит..." -- это отдельный разговор. Опять же пользователь сам способен оценить подобные варианты в зависимости от того, с какими данными он имеет дело.

Уже за то, что в определенных случаях этот способ дает существенный выигрыш в размере его уже можно было бы включить в современные архиваторы (может уже и включили -- пока не знаю).


ЗЫ:

Тут идея в голову пришла: ведь современные архиваторы подсчитывают CRC всех архивируемых файлов (разве что за исключением solid-архивирования). В таком случае что им стоит по окончании процесса обычной архивации (без применения сабжевого предархиватора) сообщить пользователю, что у него столько-то файлов в архиве -- дубликаты (если судить по CRC и размеру), и что можно попробовать провести повторное архивирование (уже с сабжевым предархиватором) и получить примерно такое-то уменьшение размера итогового архива. Кстати, подобное предупреждение так же можно сделать опциональным. Таким образом (по размеру и CRC файлов) можно проверять на вшивость и уже готовые архивы со стороны.

Эх, мечты, мечты ... :roll:

_________________
ПС: [13-06-2006] Идеальный скриншот BIOS'а ? Запросто ! // K.V.


 

member+
Статус: Не в сети
Регистрация: 16.01.2004
Откуда: Estonia,Tallinn
xKVtor У меня тоже была идея доработать архиватор, (тоже методом предархивации, но другим алгоритмом) и я уверен что это хорошая идея, но я так-же уверен что для того чтоб за тобой подтянулись люди, нужен какой нибудь действенный пример...

_________________
X99-TF/E5-2678v3+Evo212/2x16Gb-DDR4-Gloway-TYPE-a@2133-12-13-13-26/GTX1070TI/KINGSTON-SNV2S1000G


 

Member
Статус: Не в сети
Регистрация: 01.06.2003
Откуда: Pskov
Пример чего ? Ситуации, когда такая фишка понадобилась ?

Все действенные примеры крутятся в основном вокруг BAСKup'ов. :)

Была у меня раньше привычка ставить на собираемые компы уже готовую винду: собираешь комп, кидаешь на винт нужные папочки, запускаешь и тестишь. И не надо ждать, пока винда+дровишки установится, и больше времени тестам уделяешь. Вот только приходилось все образы windows хранить на рабочем винте. А если еще учесть, что под каждую материнку нужна своя "винда", и что материнок не один десяток, то этих образов накопилось на несколько десятков гигов. Причем все они между собой процентов на 70..80 совпадали и отличались только дровами, конфигами, логами и прочей мелочевкой.

Если бы на тот момент подобная фишка существовала в каком-либо архиваторе, то весь занимаемый объем можно было безболезненно сократить до 2-3 гигов. А так пришлось изголяться, причем не совсем удачно, но это уже к сути вопроса не относится.

Другой пример. При тестировании какого либо железа (обычно материнки, видеокарты) я предпочитаю заново ставить винду и сохранять ее (из под второй винды) на разных этапах в отдельные папки (ну что поделаешь, не доверяю я всяким точкам восстановления -- чистота эксперимента важнее :)). Обычно минимальное число бакапов -- два/три:
  1. до установки драйверов;
  2. после установки драйверов/DX, но до установки софта;
  3. после установки тестового софта.
Может быть и больше в зависимости от хода эксперимента. Понятно, что процентов 90 файлов в этих двух и больше бакапах совпадает со всеми вытекающими последствиями.

Если повспоминать, то можно еще примеры привести...

Добавлено спустя 27 минут, 44 секунды:
Поставил сейчас WinRAR v.3.40fin, так там стоит копирайт (C) Александр Рошаль, хотя раньше всегда было (C) Евгений Рошаль. Что за бред ? :insane:

_________________
ПС: [13-06-2006] Идеальный скриншот BIOS'а ? Запросто ! // K.V.


 

Member
Статус: Не в сети
Регистрация: 14.03.2004
Откуда: Москва
Ну в принципе написать то можно. Только это будет ещё один exe. Хотя можно езё библиотеки rar прикрутить. В общем можно подумать.

_________________
ФИЗТЕХ- рулез, ФАКИ - сила, Кванты тоже хорошо


 

Member
Статус: Не в сети
Регистрация: 03.01.2004
Откуда: Питер
Вот появилось время (правда совсем мало) успел написать вот это :
[ссылка в последнем посте]
да-а-а тут у вас похоже все почти заглохло, или просто все сидят и пишут свои преды :)

Выполняется поиск и сравнение файлов (всего их не должно быть больше 32k) и выводятся логи.
Кстати ктонибудь может подсказать где в делфи7 спрятался диалог выбора директории, а то я его чего-то потерял :(
Да и еще, как мне создать динамический массив из записей, ну типа чтобы можно было просто добавлять элементы (как в TStringList)

Добавлено спустя 5 часов, 7 минут, 21 секунду:
Да млин, никому нет дела... (хотя с ПС 4 человека его все-таки скачали ;) ),
поактивней пожалуйста. Ваши комментарии, предложения ...
Я вот тем временем его малость доделал - теперь выполняет все, кроме восстановления.
З.Ы. ссылку поправил.


Последний раз редактировалось Lord_of_Darkness 24.10.2004 14:53, всего редактировалось 3 раз(а).

 

Member
Статус: Не в сети
Регистрация: 15.04.2004
Откуда: Москва
Lord_of_Darkness
А он нигде не прятался. его там просто нет.
Либо используй TDirectoryEdit из RX либо передними лапами вызывай SHBrowseForFolder (требует uses shlobj).

Для создания массива записей используй либо наследника от TList
и храни там указатели на твои структуры, либо напиши какой-нибудь вариант списка.
Э... батенька, а вы глючите. :(
Взял 2 файла, положил по разнвм папкам, во втором поменял 2 байта.
Твоя чудо-софтина посчитала их "одинаковыми".


 

Advanced member
Статус: Не в сети
Регистрация: 10.04.2003
Откуда: Москва
Можно глупое предложение?
Может проще сделать препроцессор, который выполняет анализ файлов нужных каталогах и создает 'батник' для архиватора.
Как 'тупой' вариант - временно переместить дублирующие файлы в временное место, запаковать (вызвать упаковщик с ключем *.*), после упаковки вернуть дубли назад.
Или еще вариант - ставить _НЕ_дублирущим файлам атрибут 'Архивный' и запускать архиватор (rar) с ключем ao (так нет риска потерять файлы)
Кстати, установка этого атрибута может быть использована и процедурами backup.


 

Member
Статус: Не в сети
Регистрация: 03.01.2004
Откуда: Питер
Avaddon
Цитата:
Взял 2 файла, положил по разнвм папкам, во втором поменял 2 байта.
Твоя чудо-софтина посчитала их "одинаковыми".

Если общий размер файла не изменился - то так и должно быть.


 

Member
Статус: Не в сети
Регистрация: 01.06.2003
Откуда: Pskov
serj_

Процитирую себя же :) :
Цитата:
3. Достаточно не удалять дубликаты, а просто не включать их в список для архивации. Этот список можно было бы подсунуть архиватору -- многие архиваторы умеют работать по ним. В список главное не забыть включить сам распаковщик (.bat)
Проще, по-моему, некуда. Заодно можно создать *.bat - файлы для запуска различных архиваторов, умеющих архивировать по спискам.

Писал автору 7-zip'а Игорю Павлову с просьбой прокомментировать обсуждаемое здесь предложение. Он ответил (еще позавчера), что при большом размере словаря и solid-архивации достигается почти тот же эффект. Проверил на двух одинаковых папках по 25Mb и размере словаря в 32Mb -- действительно, похоже на правду: архив с одной папкой и архив с двумя такими папками отличались всего лишь на 300Kb (размер каждого архива был по ~8Mb). От себя лишь замечу, что чем больше размер окна, тем больше требуется оперативки. Плюс опять же, если размер каждого из дубликатов больше половины размера словаря, то эффективность архивирования резко падает.

Так что для больших файлов и малом объеме оперативки лучше конечно использовать предархиватор. К сожалению, автор 7-zip пока не собирается встраивать нечто подобное в свое детище. :-(

Кстати, Игорь дал любопытную ссылку: http://rzip.samba.org/

Lord_of_Darkness

Цитата:
Если общий размер файла не изменился - то так и должно быть.
Так быть не должно -- дубликаты определяются по одинаковому содержимому (путем побайтного сравнения), а не по размеру.

_________________
ПС: [13-06-2006] Идеальный скриншот BIOS'а ? Запросто ! // K.V.


 

Member
Статус: Не в сети
Регистрация: 15.04.2004
Откуда: Москва
Lord_of_Darkness
??????????? С какой радости-то? Файлы разные...

_________________
Цель жизни - d20 по жизни...


 

Вестник драйверостроения
Статус: Не в сети
Регистрация: 15.10.2002
Откуда: Украина, Одесса
xKVtor
если я правильно понял, то никакой мороки быть не должно вообще :)

Цитата:
Создать полный список архивируемых файлов.

архиватор это и так делает

Цитата:
Сравнить все файлы одинаковых размеров между собой.
Из нескольких одинаковых файлов оставлять лишь один, остальные стирать, а их полный путь занести в список дубликатов.

файлы группируются по расширению, затем по имени; эффективность сжатия одинаковых/похожих файлов зависит от того, помещаются ли они в словарь

Мораль - возьми архиватор с достаточно большим размером словаря - 7-Zip и попробуй, возможно проблемы просто "сами" решатся :). Обычно хватает словаря размером 32 МБ, но можешь поэкспериментировать, например, с уменьшением степени сжатия (большая скорость) и увеличением размера словаря (если твои одинаковые файлы большие, больше ~16 МБ)


 

Member
Статус: Не в сети
Регистрация: 01.06.2003
Откуда: Pskov
fin писал(а):
если я правильно понял, то никакой мороки быть не должно вообще :)
Дык никакой мороки и нет. Я лишь предложил способ сделать архив еще меньше :)

Цитата:
файлы группируются по расширению, затем по имени; эффективность сжатия одинаковых/похожих файлов зависит от того, помещаются ли они в словарь
В том-то и дело, что расширение и название у двух одинаковых файлов совпадать не обязано.

Цитата:
Мораль - возьми архиватор с достаточно большим размером словаря - 7-Zip и попробуй, возможно проблемы просто "сами" решатся :).
Я прекрасно понимаю, что множество мелких и средних одинаковых файлов можно достаточно эффективно жать с помощью того же 7-zip'а с большим словарем. Но зачем довольствоваться тем, что имеешь, если можно попытаться сделать еще лучше. Своего рода, оверклокинг архиватора :-)

Кстати, размер итогового архива у 7-zip'а при выборе метода STORE совершенно не зависит от параметра SOLID (что и не удивительно).
А вот если предархиватор использовать, то степень компрессии каждого файла была бы нулевой, зато степень компрессии всего архива была бы отличной от нуля при наличии дубликатов. Причем затраченное время было бы практически таким же или незначительно больше (зависит от размеров файлов -- помещаются они в памяти или нет).

_________________
ПС: [13-06-2006] Идеальный скриншот BIOS'а ? Запросто ! // K.V.


 

Вестник драйверостроения
Статус: Не в сети
Регистрация: 15.10.2002
Откуда: Украина, Одесса
xKVtor
Цитата:
Своего рода, оверклокинг архиватора
Это "оверклокинг" под твои конкретные задачи, я бы еще подумал хорошо, стоит ли с этим так морочиться :). В остальном примерно тебя понял, но меня всегда в этих вопросах выручал просто большой словарь.


 

Member
Статус: Не в сети
Регистрация: 03.01.2004
Откуда: Питер
xKVtor
Avaddon
Млин, ну пока так должно быть... Пока я побитовое сравнение не сделал ;)

_________________
Здесь так мало тех, с кем легко говорить,
Еще меньше тех, с кем не страшно молчать (c)


 

Member
Статус: Не в сети
Регистрация: 03.01.2004
Откуда: Питер
Вот добавил проверку контрольной суммы файла,
и создание батника для восстановления файлов.

Возникла пара вопросов:
По бат-файлу:
1. Если название папки - кирилица то батник файлы в эту папку не копирует (насчет названий файлов незнаю - непроверял, но думаю тоже копироваться небудут) как обойти эту проблему?
2. Какой командой создавать директорию, и есть ли команда для создания директории таким образом:
допустим у меня есть папка C:>f1 мне нужно создать C:>f1>folder2>fl3>fld , можно ли это сделать одной командой? И что будет если папки уже существуют?

По программе:
1. Есть ли смысл делать более сторгое сравнение файлов чем по контрольной сумме, т.к. это довольно длительный процесс (в смысле тор-мо-з-и-и-и-ить будет...)

ЗЫ
батник пока пашет только если нет русских имен (файлов либо папок) и если все папки созданы,
т.е. он фактически только раскладывает файлы по папкам.

Всем файлам, предназначенным для архивации задается атрибут "архивный", для остальных - он снимается.

ЗЫ ЗЫ Ссылку подправил

Добавлено спустя 3 минуты, 37 секунд:
Вот на всякий случай еще раз:
[ссылка в последнем посте]

Добавлено спустя 5 часов, 29 минут, 12 секунд:
Вот написал по этому поводу кое-что, советую почитать.
http://people.overclockers.ru/lordofdarkness/records


Последний раз редактировалось Lord_of_Darkness 24.10.2004 14:57, всего редактировалось 2 раз(а).

 

Advanced member
Статус: Не в сети
Регистрация: 30.08.2003
Откуда: Санкт-Петербург
xKVtor
Цитата:
Пусть даже это займет немногим больше времени, зато в итоге окупится гораздо меньшим размером архива.

можно вопросец: а как сравнивать содержимое???
проблема (по крайней мере, ИМХО) в том, что скорость сравнения достаточно низкая => БЫСТРЕЕ и проще в большинстве случае заархивировать и получить большой файл и работать потом с ним...
Хотя, кстати, идея интересная...

_________________
{:€ дед в законе :-) нородный окодемег
почетный пользователь OpenSuSE 11.3
Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad


 

member+
Статус: Не в сети
Регистрация: 16.01.2004
Откуда: Estonia,Tallinn
Цитата:
скорость сравнения достаточно низкая => БЫСТРЕЕ и проще в большинстве случае заархивировать и получить большой файл и работать потом с ним...

в данном случае ключевое слово большенство т.е. тут не кто не заставляет пользоваться, тут рассматривают концепцию слздания такой фишки, использование это сугубо личный вопрос...

_________________
X99-TF/E5-2678v3+Evo212/2x16Gb-DDR4-Gloway-TYPE-a@2133-12-13-13-26/GTX1070TI/KINGSTON-SNV2S1000G


 

Member
Статус: Не в сети
Регистрация: 03.01.2004
Откуда: Питер
Ну пока все отдыхают в свои законные выходные, я продолжаю мучить предархиватор :) , и вот выпустил более-менее полнофункциональную версию:
[ссылка в последнем посте]

Из предыдущего поста 2-й вопрос отпал - команда MKDIR,
а первый все еще актуален. Суть проблемы: если в бат файле пишешь MKDIR "a\b\новая папка\" то папки a и b создаются нормально, а имя "новая папка" отображается неверно (квадратиками и т.д.).

_________________
Здесь так мало тех, с кем легко говорить,
Еще меньше тех, с кем не страшно молчать (c)


Последний раз редактировалось Lord_of_Darkness 24.10.2004 14:58, всего редактировалось 1 раз.

Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 52 • Страница 1 из 31  2  3  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan