Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Ограничения (баги?) при открытии и навигации в архивах

 
Post new topic   Reply to topic    Total Commander Forum Index -> Общие вопросы printer-friendly view
View previous topic :: View next topic  
Author Message
LonerD



Joined: 04 Jan 2011
Posts: 1172
Location: Макеевка

Post (Separately) Posted: Wed May 14, 2014 20:02    Post subject: Ограничения (баги?) при открытии и навигации в архивах Reply with quote

Дано: TC 8.51a x32, Windows 8.1 x64 SL (6.3.9600), места для Temp и лог-файлов предостаточно, оперативки - 32 Гб.
Архив - 7zip, внутри 3.6 млн файлов (разложенные по каталогам и подкаталогам, в корне архива - 319 каталогов), в сжатом виде - 5.1 Гб, в распакованном - около 43 Гб. Рядом (или на другом диске - без разницы) лежит этот же архив под другим именем.
Вхожу в архив штатными средствами TC. Медленно, но входит, памяти отжирается до 1.3 Гб в процессе открытия архива (после открытия - 750 Мб). Выхожу, при этом процесс Тотала продолжает отжирать 750 Мб оперативки. Пытаюсь войти во второй архив - "Error in packed file". При этом оперативка очищается (диспетчер задач показывает, что занято 7.1 Мб), но войти невозможно уже ни в первый ни во второй архив - выбивает всё ту же ошибку. Лечится перезапуском Тотала.

А вот TC x64 - свободно входит в оба архива одновременно.
Памяти Тотал начинает отжирать до 3 Гб при входе (до 2 Гб после входа).

Насколько я понимаю, проблема с TC x32 в том, что он может использовать только ограниченное количество оперативки. Это баг или очередное бессмысленное ограничение Тотала? Ведь 64-х битная ОС позволяет выделять приложениям неограниченное количество памяти (и нет ограничений на размер непрерывного блока, выделяемого приложению в оперативке).
Но даже если и так - почему после очищения оперативки Тотал отказывается входить в архивы? Это уже явный баг.

Очень медленная навигация внутри архива. Причём без разницы - хоть архив на медленном диске, хоть на SSD. Если вначале перечитывается всё содержимое архива - то почему медленно открываются подкаталоги? Если вначале читается только корень архива - то почему три десятка каталогов так медленно перечитываются? В любом случае - ведь используется 7-zip библиотека, а сам архиватор 7-Zip довольно шустро работает с этим же архивом.

Отдельный вопрос - почему оперативка не очищается при выходе из архива? Как-то не комильфо, когда архиватор (64-х битная версия) пожирает всё больше и больше ресурсов. Наверное, логично будет попросить Гислера сделать отдельную команду или настройку для очищения неиспользуемой памяти.
_________________
Windows 11 | TC DreamLair eternal pre-α
Back to top
View user's profile Send private message
MVV



Joined: 15 Oct 2009
Posts: 4815
Location: Ростов-Дон

Post (Separately) Posted: Wed May 14, 2014 20:36    Post subject: Reply with quote

Если логически подумать, в 32-битных процессах 32-битные указатели, что уже ограничивает адресное пространство до 4 ГБ, даже если система имеет их в наличии 100500. А если знать, что половину адресного пространства забирает себе система, то для нужд самого тотала остается никак не более 2 ГБ - это для тотала и всех не системных библиотек, хуков и прочей ереси. Это не ограничение тотала, это ограничение 32-битных программ.

А почему тотал повторно не может зайти в тот же архив после освобождения памяти - хороший вопрос. Как себя ведут себя плагины 7z в такой ситуации?

Добавлено спустя 5 минут:

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

Насчёт того, что память не освобождается до входа в другой архив: тотал кэширует содержимое последнего архива на каждой панели, чтобы повторный вход был моментальным. И сбрасывает кэш как раз при входе в другой архив. Собственно, для очистки кэша можно заходить в пустой архив и возвращаться назад в текущую папку.
_________________
TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel…
Back to top
View user's profile Send private message
CaptainFlint



Joined: 14 Dec 2004
Posts: 6192
Location: Москва

Post (Separately) Posted: Wed May 14, 2014 23:04    Post subject: Reply with quote

LonerD wrote:
Насколько я понимаю, проблема с TC x32 в том, что он может использовать только ограниченное количество оперативки. Это баг или очередное бессмысленное ограничение Тотала? Ведь 64-х битная ОС позволяет выделять приложениям неограниченное количество памяти (и нет ограничений на размер непрерывного блока, выделяемого приложению в оперативке).

Как выше написал MVV, воспользоваться сиими благами сможет только 64-битный процесс. 32-битному для этого надо извращаться с AWE, что Гислера, видимо, нисколько не вдохновляет, тем более, что нужно это лишь для подобных, прямо скажем, не очень часто встречающихся ситуаций.

Немножко лучше обстоит дело, если 32-битный процесс имеет флаг LARGE_ADDRESS_AWARE: тогда 64-битная система может дать ему доступ ко всему 4-гигабайтному адресному пространству, не отбирая оттуда 2 Гб под свои нужды. Но у Тотала этот флаг не установлен (Гислер говорит, соответствующей опции нет в линкере Delphi).

LonerD wrote:
Очень медленная навигация внутри архива.

Работа с архивами производится не так, как с обычной файловой системой. Список файлов там обычно не делится по каталогам, а хранится сплошняком (в виде относительных путей) и поэтому грузится в память целиком. Так что каждое действие по навигации приводит к поиску и фильтрации всего этого списка из 3,6 млн записей для выдачи содержимого конкретного подкаталога. Понятно, что это — дело небыстрое. Скорость диска роли не играет, т.к. список весь в памяти.

LonerD wrote:
а сам архиватор 7-Zip довольно шустро работает с этим же архивом.

Тотал жёстко связан RAR-подобным плагиновым интерфейсом. Я не знаю ни структуры 7z-архивов, ни кода 7-Zip, но очень может быть, что для навигации там используются дополнительные возможности, не укладывающиеся в рамки WCX API. Впрочем, не исключено, что Гислер просто не исследовал этот сценарий, и там ещё есть резервы по оптимизации.
_________________
Почему же, ё-моё, ты нигде не пишешь "ё"?
Back to top
View user's profile Send private message
MVV



Joined: 15 Oct 2009
Posts: 4815
Location: Ростов-Дон

Post (Separately) Posted: Wed May 14, 2014 23:24    Post subject: Reply with quote

CaptainFlint wrote:
Немножко лучше обстоит дело, если 32-битный процесс имеет флаг LARGE_ADDRESS_AWARE: тогда 64-битная система может дать ему доступ ко всему 4-гигабайтному адресному пространству, не отбирая оттуда 2 Гб под свои нужды. Но у Тотала этот флаг не установлен (Гислер говорит, соответствующей опции нет в линкере Delphi).

Насколько я знаю, бит LARGE_ADDRESS_AWARE - лишь указание системе, что приложение понимает беззнаковые указатели, и может помочь лишь в случае, когда в системе сдвинута граница юзер-ядро с исходной 2-2 на, скажем, 3-1. Системные библиотеки всё равно будут загружаться по своим же адресам, и фрагментация памяти никуда не денется.

Quote:
Тотал жёстко связан RAR-подобным плагиновым интерфейсом. Я не знаю ни структуры 7z-архивов, ни кода 7-Zip, но очень может быть, что для навигации там используются дополнительные возможности, не укладывающиеся в рамки WCX API. Впрочем, не исключено, что Гислер просто не исследовал этот сценарий, и там ещё есть резервы по оптимизации.

У 7Z структура гораздо более продвинутая, чем у RAR (позор Рошалу, что в RAR5 в этом плане ничего принципиально не изменилось): там информация о файлах хранится в виде таблицы в одном месте архива, и заодно сжимается с помощью того же LZMA, не надо бродить по архиву, чтобы прочитать его (когда не было 7Z, одной из причин, по которым я полюбил CAB, было гораздо более быстрое чтение оглавления, т.к. оно там централизованное, да и степень сжатия зачастую не уступала RAR). Интерфейс 7-Zip спокойно обрабатывает архивы, в которых файлы имеют одинаковые имена (инсталлеры, например), в то время как тотальный WCX API такого не позволяет - возможно, обращение по индексам и хранение структуры в виде деревьев повысило бы скорость доступа к файлам. Не говоря уже о том, что не нужен был бы непрерывный блок для хранения оглавления архива.
_________________
TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel…
Back to top
View user's profile Send private message
CaptainFlint



Joined: 14 Dec 2004
Posts: 6192
Location: Москва

Post (Separately) Posted: Thu May 15, 2014 01:13    Post subject: Reply with quote

MVV wrote:
Насколько я знаю, бит LARGE_ADDRESS_AWARE - лишь указание системе, что приложение понимает беззнаковые указатели, и может помочь лишь в случае, когда в системе сдвинута граница юзер-ядро с исходной 2-2 на, скажем, 3-1. Системные библиотеки всё равно будут загружаться по своим же адресам, и фрагментация памяти никуда не денется.

Про фрагментацию я ничего и не говорил, а память всё-таки может выделяться вся. Сам не так давно узнал об этом.
_________________
Почему же, ё-моё, ты нигде не пишешь "ё"?
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Общие вопросы All times are GMT + 4 Hours
Page 1 of 1

 
Jump to:  
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