Форум » GUI » Как сделать многопотоковое архивирование папок? » Ответить

Как сделать многопотоковое архивирование папок?

rovix: В примерах дистрибутива есть пример работы с плагином 7zip (SAMPLES\Advanced\7-Zip). Пытался переделать его на многопотоковое, но не хватает ума или с плагином 7zip это не возможно?

Ответов - 14

Andrey: rovix пишет: Пытался переделать его на многопотоковое, Пример в студию !

AlexMyr: rovix пишет: Пытался переделать его на многопотоковое, но не хватает ума или с плагином 7zip это не возможно? Вот что говорит доступная wikipedia: многопоточное сжатие. Если на одноядерном процессоре скорость 7-Zip близка к WinRAR[10], то на двухъядерном 7-Zip намного быстрее. Помимо обычной многопоточной оптимизации программа имеет очень хорошую оптимизацию для технологии Hyper-Threading и «виртуальных» ядер в процессорах Intel; А теперь скажите, что Вы хотели бы получить от супер-многопоточности? Да, и вдогонку, может другую GUI попробуете?

rovix: Задача: Есть порядка 30 папок которые нужно архивировать каждый день. Если запустить архивирование поочередно, то архивирование завершается примерно за час. Если же запустить архивирование параллельно в пяти процессах, то минут 20. Может быть я не совсем корректно выразился на счет потоков. Сейчас это реализовано по следующему алгоритму: -создается массив по количеству потоков архивирования -в каждом потоке (псевдопотоке), физически просто вызывается внешний 7-zip с параметрами, но id процесса запоминается в соответствующей ячейке массива, т.е. в случае пятипотокового архивирования первые пять процессов, точнее их id запоминаю в элементах массива -в цикле проверяю наличие процессов с указанными в массиве id -если процесс закончился, то запускается следующий и так далее Пять выбрано из-за того, что машинка о восьми головах, так чтобы на процесс создания архивов оставались свободные ресурсы и для других целей. В менеджере задач четко видны ядра, которые заняты 7-zip. В демо-примере подкупила графическая полоска индикатора. Однако в первых же поисках споткнулся об то, что харбор вроде бы не может получить id запущенного процесса, по крайней мере в имеющейся документации я такого обнаружить не смог :( во-вторых, не имея четкого представления работы с потоками не смог переделать демо-пример для запуска тестового примера с запуском процесса архивирования с помощью 7-zip'овской длл'ки в потоке. Отбросил все лишние рюшечки в демопримере до [pre2]#include "MiniGUI.ch" #define ALONE_7Z '7za.exe' // console variant of 7-Zip archiver Static cPath7z := '' // Full path to installed 7-Zip archiver Procedure Main // Формируем полное имя установленного 7-Zip. Для упрощения, принимем // что программа установлена в каталог по умолчанию cPath7z := GetProgramFilesFolder() + '\7-zip\7z.exe' Define window wMain ; At 0, 0 ; Width 140 ; Height 100 ; Title 'Demo 7-Zip interaction' ; Icon 'main.ico' ; Main ; NoMaximize ; On init FuncOne() @ 20, 15 ButtonEx btnCreate ; Caption 'exit' ; Action wMain.release ; DEFAULT End window Center window wMain Activate window wMain Return proc FuncOne() Local cCommand := 'A 21.7z "D:\MiniGUI\SAMPLES\Advanced\7-Zip\test"', ; cCommand2 := 'A 22.7z "D:\MiniGUI\SAMPLES\Advanced\7-Zip\230900.dbf"', ; nDLLHandle cCommand := RTrim( cCommand ) If !( ( nDLLHandle := LoadLibrary( '7-zip32.dll' ) ) > 0 ) MsgStop( "Can't load 7-zip32.dll.", 'Error' ) Else DllCall( nDLLHandle, DC_CALL_STD, 'SevenZip', _HMG_MainHandle, cCommand ) FreeLibrary( nDLLHandle ) Endif return[/pre2] а дальше никак не получается. Пробую, как мне кажется, самое простое: [pre2]#include "MiniGUI.ch" #define ALONE_7Z '7za.exe' // console variant of 7-Zip archiver Static cPath7z := '' // Full path to installed 7-Zip archiver Procedure Main // Формируем полное имя установленного 7-Zip. Для упрощения, принимем // что программа установлена в каталог по умолчанию cPath7z := GetProgramFilesFolder() + '\7-zip\7z.exe' Define window wMain ; At 0, 0 ; Width 140 ; Height 100 ; Title 'Demo 7-Zip interaction' ; Icon 'main.ico' ; Main ; NoMaximize ; On init arc() @ 20, 15 ButtonEx btnCreate ; Caption 'exit' ; Action wMain.release ; DEFAULT End window Center window wMain Activate window wMain Return proc arc() thID1 := hb_threadStart( @FuncOne()) return proc FuncOne() Local cCommand := 'A 21.7z "D:\MiniGUI\SAMPLES\Advanced\7-Zip\test"', ; cCommand2 := 'A 22.7z "D:\MiniGUI\SAMPLES\Advanced\7-Zip\230900.dbf"', ; nDLLHandle cCommand := RTrim( cCommand ) If !( ( nDLLHandle := LoadLibrary( '7-zip32.dll' ) ) > 0 ) MsgStop( "Can't load 7-zip32.dll.", 'Error' ) Else DllCall( nDLLHandle, DC_CALL_STD, 'SevenZip', _HMG_MainHandle, cCommand ) FreeLibrary( nDLLHandle ) Endif return [/pre2] а оно не работает... 2AlexMyr Возможно нужно было какие-нибудь ключики в команду вставить для включения этой многопроцессорной оптимизации, каюсь не пробовал, может тогда и правда смысла не будет заморачиваться. P.S. Какую другую GUI предлагаешь попробовать?


AlexMyr: rovix пишет: Возможно нужно было какие-нибудь ключики в команду вставить для включения этой многопроцессорной оптимизации, каюсь не пробовал, может тогда и правда смысла не будет заморачиваться. Для проверки запустите вручную архивирование и посмотрите в диспетчере задач сколько процессов 7z исполняется, если используете стандартный алгоритм lzma, то многопоточность вроде автоматом используется. rovix пишет: P.S. Какую другую GUI предлагаешь попробовать? для этой задачи GUI не поможет.rovix пишет: Задача: Есть порядка 30 папок которые нужно архивировать каждый день. у себя использую arc, больше 2гиг с кучей папок примерно 35 минут, просто запускаю стандартным диспетчером задач в виндовс по времени.

rovix: AlexMyr, что такое arc? Пробовал 7zip у себя на компе явно видно что запускается в мультипотоковом режиме (и диспетчер задач пишет 5 потоков), а когда запускаю на сервере, то полное впечатление что на одном ядре идёт хотя диспетчер задач пишет, что 3 потока :(

AlexMyr: rovix пишет: что такое arc? http://freearc.org/ru/Default.aspx

rovix: у меня около 30 разных папок (архивировать в разные файлы) объёмом около 20гиг :(. Папки разные от нескольких десятков мег до 4-х с лишним гиг. Пока создается архив с самой большой папкой в параллельных процессах успевает заархивироваться всё остальное :) Так что "многопоточность форева!"

rovix: за ссылочку спасибо, потестирую. А спрашивал потому, что когда-то на заре эры компьютеризации был такой архиватор, но тогда он значительно уступал arj, потом и rar'y

Andrey: А почему остановились на архиваторе 7z ? Есть же в МиниГуи zip-библиотеки. Запустить их в несколько потоков и пускай делают архив... Или каждый поток - определенное кол-во файлов или папок... На выбор и желание !

Dima: rovix пишет: Если же запустить архивирование параллельно в пяти процессах, то минут 20 При такой операции системка повиснет наглухо , бедный HDD..........придется менять его каждые пол годика (или чаще ). Попробуйте тем же Total Commander покопировать разные папки в разные точки назначения (в фоне каждый процесс) , или c Winrar проделайте ту же операцию. Проц грузится почти на все 100 , будь в нем хоть 20 ядер (ядреных) ;) Возможно с винтом SSD все обстоит не много лучше , не знаю не юзал. Мне кажется что нужно понимать когда и где юзать эту самую многопоточность. rovix пишет: у меня около 30 разных папок (архивировать в разные файлы) объёмом около 20гиг :(. Папки разные от нескольких десятков мег до 4-х с лишним гиг. Пока создается архив с самой большой папкой в параллельных процессах успевает заархивироваться всё остальное :) Так что "многопоточность форева!" А попробуйте то же самое сделать последовательно, папка за папкой (без потоков) . Будет какой то выигрыш по времени ?

rovix: Давайте попробуем представить что же происходит при многопользовательском доступе к базе данных с жестким диском на сервере... Система абсолютно не виснет, в менеджере задач явно видно какие ядра заняты 7zip`ом, не знаю почему, но на сервере 7zip не забирает все ядра под себя. Выигрыш по времени примерно четырехкратный. Andrey пишет: А почему остановились на архиваторе 7z ? Из-за объёмов, 7zip сжимает значительно сильнее.

Andrey: rovix пишет: Из-за объёмов, 7zip сжимает значительно сильнее. Я тут тесты провел, несколько папок, файлы *.dbf *.fpt *.dbt *.tbr *.txt *.log - объем примерно 5Гб, сделал архивацию несколькими архиваторами, получилось: формат zip (через Winrar) - архив получился 144Мб, создает за 2 мин. формат arc (через FreeArc) - архив получился 61Мб, создает за 13 мин. формат zip (через 7z) - архив получился 145Мб, создает за 5 мин. формат 7z (через 7z) - архив получился 85Мб, создает за 12 мин. Ну конечно нужно подбирать методы сжатия для увеличения быстродействия.... 7z медленно делает, хотя и хорошо. Я тоже бы не отказался от 4х кратного выигрыша по времени! Пиши тогда автору программы, там и мыло его есть. О результатах потом сообщи....

rovix: Andrey, спасибо за тесты, сам собирался проверить, но всё никак на работе запарка, думаю сегодня всё же вечерком проверю freearc в параллельном режиме. Однако не понял про какого автора идёт речь? Я же не 7zip улучшаю, а пытаюсь узнать как в харборе запускать параллельно несколько процессов и следить за ними. Под параллельно имеется ввиду системный запуск программы из харбора что-то типа Run().

Andrey: rovix пишет: Однако не понял про какого автора идёт речь? Advanced\7-Zip\Demo.prg /* * MINIGUI - Harbour Win32 GUI library Demo * * Access to 7z archives by 7-zip32.dll demo * (c) 2008 Vladimir Chumachenko <ChVolodymyr@yandex.ru> * * Revised by Grigory Filatov <gfilatov@inbox.ru> */ // Complementary libraries: // xhb.lib, hbdll32.lib



полная версия страницы