View previous topic :: View next topic |
Author |
Message |
MVV
Joined: 15 Oct 2009 Posts: 4811 Location: Ростов-Дон
|
|
Back to top |
|
|
Reflector
Joined: 29 Nov 2009 Posts: 56
|
(Separately) Posted: Thu Dec 02, 2010 21:54 Post subject: |
|
|
MVV wrote: |
По идее, 7zG нельзя запустить до того как список готов. Раз запускается, значит, в этот момент список уже готов. А почему блокируется тотал - это уже вопрос.
|
Раз запускается сразу, значит не ждет окончания построения списка, т.к. тотал только размер той папки считает 4 сек |
|
Back to top |
|
|
MVV
Joined: 15 Oct 2009 Posts: 4811 Location: Ростов-Дон
|
(Separately) Posted: Thu Dec 02, 2010 21:59 Post subject: |
|
|
Архиватору нужно передавать полностью построенный список. Возможности подкинуть еще файлов для упаковки нет. Поэтому невозможно запустить 7zG до окончания формирования списка.
Проверил сейчас на папке Windows от семерки. Примерно 24 секунды строился список файлов. Потом в списке процессов появился 7zG, потом прошло еще секунд 14, в тотале исчез диалог упаковки, прошло еще несколько секунд - и появился диалог создания архива. Видимо, эти 14 секунд архиватор что-то упорно грузит, и система ждет. При запуске любой программы тот, кто ее запускает, вынужден некоторое время ждать, нельзя спустить сразу. Но, думаю, если передать инициативу фоновому потоку - можно будет закрыть окно упаковки сразу. Т.е. просто строим список файлов, создаем фоновый поток и передаем ему путь к списку файлов и флаги - и всё, забываем о нем, он сам запускает архиватор и удаляет список файлов по завершении.
Кстати, тут еще вопрос, кто больше тормозит - тотал или плагин. Тоталу ведь надо построить список файлов, который передать плагину - а если в папке 56 тыщ файлов, на это нужно время.
Еще можно время от времени вызывать функцию прогресса, чтобы юзер видел, какой файл обрабатывается - допустим, можно не на каждый файл, если их много, а на каждый десятый и т.п., чтоб интерфейс не сильно тормозил процесс. Например, пока файлов меньше 100, пишем на каждый файл, потом до 1000 на каждый 5-й, потом - на каждый 10-й. _________________ TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel…
Last edited by MVV on Thu Dec 02, 2010 23:49; edited 6 times in total |
|
Back to top |
|
|
Reflector
Joined: 29 Nov 2009 Posts: 56
|
(Separately) Posted: Thu Dec 02, 2010 22:05 Post subject: |
|
|
MVV wrote: |
Архиватору нужно передавать полностью построенный список. Возможности подкинуть еще файлов для упаковки нет. Поэтому невозможно запустить 7zG до окончания формирования списка.
|
А я о чем говорю? Запакуются только те файлы, которые на тот момент были с списке... Тебя послушать, так невозможно писать программы с ошибками |
|
Back to top |
|
|
MVV
Joined: 15 Oct 2009 Posts: 4811 Location: Ростов-Дон
|
(Separately) Posted: Thu Dec 02, 2010 22:22 Post subject: |
|
|
Кстати, плагин использует не файл списка, а ту же хитрую методику, как и расширение оболочки - возможно, она позволяет строить список файлов на лету, я не знаю. _________________ TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel… |
|
Back to top |
|
|
mrmerak
Joined: 20 Aug 2007 Posts: 441
|
(Separately) Posted: Fri Dec 03, 2010 09:34 Post subject: |
|
|
От блин. Уже обрадовался и думал качать, но потом прочитал коменты от MVV и Reflector... _________________ TC 9.51 | Win10 1903 |
|
Back to top |
|
|
Total7zip
Joined: 27 Nov 2010 Posts: 287
|
(Separately) Posted: Fri Dec 03, 2010 10:33 Post subject: |
|
|
что-то не так в этих комментах...
наверное то, что долго запускается диалог архивации, если для упаковки выбрать папку размером в несколько гигабайт?
тут все зависит от того как такое обрабатывать -
можно попросить чашку кофе, а можно прийти в кафе со списком нужных вам молекул.
можно сказать что надо запаковать такую-то папку. а можно просканировать ее и составить список всех файлов. можно дать список в удобном формате а можно в извращенном.
тотал идет по "простому" второму пути. и получается, что например у меня в папке Windows на 64-битной Win7
15,6 GB и 96 283 Files, 21 346 Folders
пути хранятся как правило в строках, длинной MAX_PATH, это 255 символов по 2 байта. Тут я беру минимум, потому что на самом деле тотал, всегда когда дает пути к файлам в Unicode использует 1024 символа.
итого:
1)96 283 + 21 346 = 117629 (файлов и папок)
2)117629 * 256 * 2 = 60226048 (длина списка в байтах)
то есть тотал готовит для плагина список, размером приблизительно
60 МЕГАБАЙТ. (если считать по 1024 символа, то умножте размер обрабатываемой тоталом информации на 4). причем основные тормоза тут в файловой системе, так как это не просто строки а имена файлов, которые надо еще и получить.
3)дальше тотал передает этот "чудо" список не массивом указателей, а одной длинной строкой "сосиской", неизвестной длины. и чтоб разобрать его надо идти символ за символом -
если встретился 0, то это конец имени, после него начало следующего.
если начало следующего тоже 0, то список кончился.
я попробую оптимизировать с того места, когда начинает работать мой код, но по-моему сам метод порочный.
вывод - не надо упаковывать гигантские папки с помощью плагинов тотал коммандера. =) |
|
Back to top |
|
|
mrmerak
Joined: 20 Aug 2007 Posts: 441
|
(Separately) Posted: Fri Dec 03, 2010 11:35 Post subject: |
|
|
Total7zip
Quote: | вывод - не надо упаковывать гигантские папки с помощью плагинов тотал коммандера. =) |
вот с прошлым плагом была такая ж беда Приходилось для таких целей юзать обычный 7з через контекстное меню.
А хотелось бы по-крутому: закинуть 7z.dll и 7zG.exe - и не ставить каждый раз сам 7з _________________ TC 9.51 | Win10 1903 |
|
Back to top |
|
|
Total7zip
Joined: 27 Nov 2010 Posts: 287
|
(Separately) Posted: Fri Dec 03, 2010 12:06 Post subject: |
|
|
я поищу обходные пути.
как мимнимум, для начала я могу "отпустить" тотал в тот момент когда он передал мне список, не дожидаясь запуска 7zG. тогда зависание не будет таким долгим.
возможно вариант с кнопкой на тулбаре будет работать быстро.
вот из хэлпа тотала
Code: |
%N places the filename under the cursor into the command line.
%T inserts the current target path. Especially useful for packers.
|
надо попробовать. только не знаю как там с unicode именами дело обстоит.
но я все равно сделаю в плагине упаковку, изменение и удаление из архивов. на обычных папках, по-моему производительность нормальная. |
|
Back to top |
|
|
Reflector
Joined: 29 Nov 2009 Posts: 56
|
(Separately) Posted: Fri Dec 03, 2010 14:29 Post subject: |
|
|
Total7zip wrote: |
вывод - не надо упаковывать гигантские папки с помощью плагинов тотал коммандера. =)
|
Вот смотри, я даю паковать папку Win7 твоему плагину, через 7 сек в процессах появляется 7zG.exe, через 40 сек он появляется в панели задач(может вчера у меня запускался 7zG от предыдущих паковок когда я начинал следующие? ) Затем я переключаюсь на свой плагин и 7zG начинает паковать уже на 6-й сек, потому что список, который он получает, состоит из одной строки "Windows". Я же писал в начале, что 7z не любит большие списки, а его упрощение операция довольно быстрая... |
|
Back to top |
|
|
MVV
Joined: 15 Oct 2009 Posts: 4811 Location: Ростов-Дон
|
(Separately) Posted: Fri Dec 03, 2010 14:48 Post subject: |
|
|
Quote: | 3)дальше тотал передает этот "чудо" список не массивом указателей, а одной длинной строкой "сосиской", неизвестной длины. и чтоб разобрать его надо идти символ за символом -
если встретился 0, то это конец имени, после него начало следующего.
если начало следующего тоже 0, то список кончился. | Зато поддерживаются списки исключений, скрытые файлы и прочие "фишки" тотала.
Согласен, неизвестная длина - это проблема. Но по идее здесь нужно лишь писать в файл символ за символом, а на каждом нулевом байте записывать в файл символ конца строки, а на паре нулевых - закрыть файл и передать его архиватору. Хотя, конечно, если используется не файл, а блок памяти, то всё сложнее, т.к. заранее определить необходимый размер блока невозможно. Но тут можно сделать всё в 2 прохода - за первый построить массив указателей на имена и длин (длины все равно понадобятся, как и указатели), заодно по ходу посчитав суммарную длину, а за второй - сделать остальную часть работы.
Все равно, думаю, больше по времени займет у самого тотала составление такого списка. Ведь ему придется перечислить содержимое всех выделенных директорий, по ходу дела фильтруя элементы, и при этом сохранить всё в памяти - и опять же, он не знает заранее, буфер какого размера ему понадобится, т.е. имеет проблему посерьезнее. _________________ TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel… |
|
Back to top |
|
|
Reflector
Joined: 29 Nov 2009 Posts: 56
|
(Separately) Posted: Fri Dec 03, 2010 15:33 Post subject: |
|
|
MVV wrote: |
Зато поддерживаются списки исключений, скрытые файлы и прочие "фишки" тотала.
|
Я все не мог понять причем тут списки исключений... Если ты пакуешь папку со скрытыми файлами, то они все окажутся в архиве, а если ты пакуешь zipом папку с файлами присутствующими в списке исключений, то они исключаются, т.е. если список исключений у вас не пуст, то нет никаких гарантий, что вы получите архив с оригинальными файлами. Вот что, по-твоему, можно прописать в этот список, чтобы оно случайно не исключилось из какого-нибудь архива? Примечательно то, что если паковать в tar или rar, то тотал передает им все файлы, даже если если они есть в списке исключений. Короче мне кажется, что паковать нужно все, иначе это будет лотерея... |
|
Back to top |
|
|
Reflector
Joined: 29 Nov 2009 Posts: 56
|
(Separately) Posted: Fri Dec 03, 2010 15:36 Post subject: |
|
|
MVV wrote: |
Все равно, думаю, больше по времени займет у самого тотала составление такого списка.
|
Я же написал, что у меня построение + перестроение списка занимает 6 сек. |
|
Back to top |
|
|
Total7zip
Joined: 27 Nov 2010 Posts: 287
|
(Separately) Posted: Fri Dec 03, 2010 15:40 Post subject: |
|
|
Reflector wrote: | Я же писал в начале, что 7z не любит большие списки, а его упрощение операция довольно быстрая... |
если можно, то расскажите как упростить список.
по-моему эта задача решения не имеет.
дано: список из N файлов и папок. например все они из Windows.
нужно: догадаться что этот список равен Windows\*
а вдруг в папке Windows на самом деле N+M файлов?...
по-моему "упростить" можно только одним способом -
найти общий корень, получить самому список всего что там есть и сравнить списки.
если у вас другое решение - с удовольствием воспользуюсь.
MVV wrote: |
Все равно, думаю, больше по времени займет у самого тотала составление такого списка. Ведь ему придется перечислить содержимое всех выделенных директорий, по ходу дела фильтруя элементы, и при этом сохранить всё в памяти - и опять же, он не знает заранее, буфер какого размера ему понадобится, т.е. имеет проблему посерьезнее. |
я даже добавлю, что я посмотрел из-за чего тормозит потом 7zG.
он идет по этому огромному списку файлов и проверяет каждую строчку как МАСКУ. так что тормоза включены на полную с обеих сторон. |
|
Back to top |
|
|
Total7zip
Joined: 27 Nov 2010 Posts: 287
|
(Separately) Posted: Fri Dec 03, 2010 15:45 Post subject: |
|
|
Reflector wrote: | паковать нужно все, иначе это будет лотерея... |
согласен, я то же самое думаю про команду MOVE.
удалять можно только то, что гарантировано попало в архив.
если буду делать эту фичу, то только так -
запаковали,
дальше идем по списку - если файл есть в новом архиве, удаляем исходник. пранойя, конечно, но это лучше чем просто удалить весь список, а потом узнать что у 7zG изменились коды возвращаемых значений =) |
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|