Open johnd0e opened 6 years ago
Это не фантомные каталоги. Это я не сподобился до сих пор сделать поддержку юникодных инсталях. А 7зипе оно если, а у меня пока нет.
Мы терпеливо ждём :)
В v1.12 Git 8a66d15 имена видны корректно:
V1.11.2:
v1.12.0 Git 8a66d15:
, но алгоритм распаковки, особенно если встречается /LZMA /SOLID пока работает медленно . Для теста брал mkvtoolnix-64-bit-31.0.0-setup.exe c https://www.bunkus.org/videotools/mkvtoolnix/ . Распаковка происходит с многочисленными переходами по дереву каталогов и в итоге занимет 121 сек. Берём ArcLite с 7z.dll v18.06 - там данная операция займёт порядка 1 сек, в Observer 1.11.2 - ~2,4 сек (по секундомеру). Но, ошибок в распаковке не было.
Это ожидаемо. Сейчас тут 7zip 18.06 практически без изменений. Оптимизацию под solid архивы я отдельно накручивал на оригинальный код 7zip-а, там не предназначено для распаковки по одному файлу. Самое сложное теперь вспомнить всё что я там наоптимизировал и портировать в новый код.
Это да, главное что уже алгоритм работает. И не получить этот подарок - "comctl32.dll bug with the TaskDialogIndirect API which is triggered by sending the TDM_NAVIGATE_PAGE message from a non-gui thread to the main gui thread message loop for the dialog". Эта ошибка появилась в Vista, но не устранена и в десятке.:) Видимо руки не дошли.:)
Поглядел на том же тесте с MKVToolNix Git 7835ddff2 - индикатор дёргаться перестал, время распаковки сократилось до 01:49 Основое время было затрачено на HTML хелп - там много мелких файлов.
Посмотрел Git c2e545b на FileZilla_3.42.1_win64-setup.exe - фантомных каталогов нет, NSIS 3.0 поддерживается, но время распаковки превысило четыре минуты,в то же время ArcLite b306 с 7z.dll 19.00 - около 4 секунд. В FZC много мелочи в ресурсах и при копировании на флешку они копируются дольше всего. Тут нужна оптимизация типа "считали оглавление каталога, временно сделали его текущим и начали копирование только файлов от него, Его подкаталоги обходим последовательно после копирования всех файлов в нём выполняя операции копирования аналогичным способом". В черновом варианте идея алгоритма такая, его цел исключить операции перехода в корневой каталог архива и обратно между файлами находящимися на одном уровне вложенности. Это по идее должно ускорить распаковку...
В NSIS-е нет каталогов у запакованых файлов. Все каталоги в скрипте прописаны и не зависят от порядка файла в запакованом блоке. 7зип распаковывает либо пачкой быстро, либо по одному медленно, на каждый вызов позиция solid-архива сбрасывается в начало. Чтобы Observer тоже быстро распаковывал, нужно это обойти. Пока способа рабочего не нашел, то что использовалось в старой версии не походит.
Пока способа рабочего не нашел,
Распаковывать все, а писать только нужные?
Не, тут другое. Плагин же по одному распаковывает файлы, а не пачкой сразу как 7зип. Это 7зип как раз так делает, сбрасывает поток в начало и распаковывает всё подряд, записывая только выбранные файлы на диск. В прошлой версии я добавил код, который пропускал сброс позиции solid-блока в начало, если файл на распаковку был дальше по потоку. А в этой версии глюки пошли. Подход то тот же будет, а вот реализацию надо найти правильную.
Понял, будем искать варианты алгоритма.
В прошлой версии я добавил код, который пропускал сброс позиции solid-блока в начало, если файл на распаковку был дальше по потоку.
Что значит "если"? А когда файлы записаны в обратном порядке?
Если следующий файл раньше в потоке стоит, то сбрасываем позицию на начало. Как 7zip делает. Тут уже без вариантов.
johnd0e В NSIS не применяется сортировка - как автор записал в скрипте список операторов File "patch" так стуб и исполняет его, а указание на каталог куда распаковывать или копировать задаётся директивой SetOutPath "dir" которая может задаваться как для отдельного файла, так и для их группы. Например как у меня в коде:
SetOutPath "$INSTDIR\plugins\intchecker"
SetOverwrite on
File "Far\plugins\intchecker\file_id.diz"
SetOverwrite try
File "Far\plugins\intchecker\intchecker2.dll"
SetOverwrite on
File "Far\plugins\intchecker\intcheckereng.lng"
File "Far\plugins\intchecker\intcheckerpol.lng"
File "Far\plugins\intchecker\intcheckerrus.hlf"
File "Far\plugins\intchecker\intcheckerrus.lng"
File "Far\plugins\intchecker\intcheckerspa.lng"
SetOverwrite try
SetOutPath "$INSTDIR\plugins\luamacro"
где задаётся один целевой каталог, а когда требуется его сменить ставится новый SetOutPath. и тут я действительно забыл что компилятор NSIS пакует файлы в непрерывный архив группируя их по целевому каталогу в его оглавлении. Хотя наверное это и забавно так как у самого в скриптах вечно стоит режим сжатия заданный оператором SetCompressor /SOLID lzma
.
В NSIS не применяется сортировка
Я ничего о сортировке не писал кажется. Файлы имеют определённый порядок, и оптимальная скорость распаковки будет достигнута только если именно в этом порядке и будем распаковывать.
А вот панель фара может быть отсортирована произвольно. Допустим мы распаковываем 2 файла, один из которых в инталляторе физически идёт последним, первым, а другой - последним: что если мы начнём с последнего?
Если в плагин пришла команда на распаковку пачки файлов, то он их сортирует перед отправкой в модуль по порядковому номеру (в порядке поступления из модуля при чтении списка). Для NSIS-а это практически всегда совпадает с их порядком в solid-блоке.
При последовательных операциях точка отсчёта и направление чтения не играют роли т.к. время инкремента/декрента адресного счётчика (1 такт - +/- единица ммладшего значащего разряда на синхроимпульс) значительно меньше времени его перезагрузки новыми данными (от 3 тактов и выше: сброс - запись - переход в состояние счёта). Заметное увеличение длительности вызывают только операции с произвольным доступом вследствии необходимости вычисления и записи в счётчик адреса нового значения после каждой операции.
https://download.filezilla-project.org/client/FileZilla_3.34.0_win32-setup_bundled.exe В корне, и не только, отображаются странные папки, с сердечком в имени.
Внутри можно найти и искомое содержимое, но разбито по папкам оно не совсем корректно. В итоге распакованное приложение запускается с ошибкой (некоторые графические ресурсы попадают не туда).
Этот же файл arclite распаковывает без проблем.