Автор | Сообщение |
|
| |
Пост N: 33
Зарегистрирован: 31.01.13
|
|
Отправлено: 11.03.13 17:13. Заголовок: Как сделать многопотоковое архивирование папок?
В примерах дистрибутива есть пример работы с плагином 7zip (SAMPLES\Advanced\7-Zip). Пытался переделать его на многопотоковое, но не хватает ума или с плагином 7zip это не возможно?
|
|
|
Новых ответов нет
[см. все]
|
|
|
| постоянный участник
|
Пост N: 2732
Зарегистрирован: 12.09.06
|
|
Отправлено: 11.03.13 18:19. Заголовок: rovix пишет: Пыталс..
rovix пишет: цитата: | Пытался переделать его на многопотоковое, |
| Пример в студию !
|
|
|
|
| |
Пост N: 749
Зарегистрирован: 11.06.10
|
|
Отправлено: 11.03.13 22:51. Заголовок: rovix пишет: Пыталс..
rovix пишет: цитата: | Пытался переделать его на многопотоковое, но не хватает ума или с плагином 7zip это не возможно? |
| Вот что говорит доступная wikipedia: многопоточное сжатие. Если на одноядерном процессоре скорость 7-Zip близка к WinRAR[10], то на двухъядерном 7-Zip намного быстрее. Помимо обычной многопоточной оптимизации программа имеет очень хорошую оптимизацию для технологии Hyper-Threading и «виртуальных» ядер в процессорах Intel; А теперь скажите, что Вы хотели бы получить от супер-многопоточности? Да, и вдогонку, может другую GUI попробуете?
|
|
|
|
| |
Пост N: 34
Зарегистрирован: 31.01.13
|
|
Отправлено: 12.03.13 09:45. Заголовок: Задача: Есть порядка..
Задача: Есть порядка 30 папок которые нужно архивировать каждый день. Если запустить архивирование поочередно, то архивирование завершается примерно за час. Если же запустить архивирование параллельно в пяти процессах, то минут 20. Может быть я не совсем корректно выразился на счет потоков. Сейчас это реализовано по следующему алгоритму: -создается массив по количеству потоков архивирования -в каждом потоке (псевдопотоке), физически просто вызывается внешний 7-zip с параметрами, но id процесса запоминается в соответствующей ячейке массива, т.е. в случае пятипотокового архивирования первые пять процессов, точнее их id запоминаю в элементах массива -в цикле проверяю наличие процессов с указанными в массиве id -если процесс закончился, то запускается следующий и так далее Пять выбрано из-за того, что машинка о восьми головах, так чтобы на процесс создания архивов оставались свободные ресурсы и для других целей. В менеджере задач четко видны ядра, которые заняты 7-zip. В демо-примере подкупила графическая полоска индикатора. Однако в первых же поисках споткнулся об то, что харбор вроде бы не может получить id запущенного процесса, по крайней мере в имеющейся документации я такого обнаружить не смог :( во-вторых, не имея четкого представления работы с потоками не смог переделать демо-пример для запуска тестового примера с запуском процесса архивирования с помощью 7-zip'овской длл'ки в потоке. Отбросил все лишние рюшечки в демопримере до цитата: | #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 |
| а дальше никак не получается. Пробую, как мне кажется, самое простое: цитата: | #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 |
|
а оно не работает... 2AlexMyr Возможно нужно было какие-нибудь ключики в команду вставить для включения этой многопроцессорной оптимизации, каюсь не пробовал, может тогда и правда смысла не будет заморачиваться. P.S. Какую другую GUI предлагаешь попробовать?
|
|
|
|
| |
Пост N: 752
Зарегистрирован: 11.06.10
|
|
Отправлено: 12.03.13 10:00. Заголовок: rovix пишет: Возмож..
rovix пишет: цитата: | Возможно нужно было какие-нибудь ключики в команду вставить для включения этой многопроцессорной оптимизации, каюсь не пробовал, может тогда и правда смысла не будет заморачиваться. |
|
Для проверки запустите вручную архивирование и посмотрите в диспетчере задач сколько процессов 7z исполняется, если используете стандартный алгоритм lzma, то многопоточность вроде автоматом используется. rovix пишет: цитата: | P.S. Какую другую GUI предлагаешь попробовать? |
|
для этой задачи GUI не поможет.rovix пишет: цитата: | Задача: Есть порядка 30 папок которые нужно архивировать каждый день. |
|
у себя использую arc, больше 2гиг с кучей папок примерно 35 минут, просто запускаю стандартным диспетчером задач в виндовс по времени.
|
|
|
|
| |
Пост N: 35
Зарегистрирован: 31.01.13
|
|
Отправлено: 12.03.13 22:57. Заголовок: AlexMyr, что такое a..
AlexMyr, что такое arc? Пробовал 7zip у себя на компе явно видно что запускается в мультипотоковом режиме (и диспетчер задач пишет 5 потоков), а когда запускаю на сервере, то полное впечатление что на одном ядре идёт хотя диспетчер задач пишет, что 3 потока :(
|
|
|
|
| |
Пост N: 756
Зарегистрирован: 11.06.10
|
|
Отправлено: 12.03.13 23:07. Заголовок: rovix пишет: что та..
|
|
|
|
| |
Пост N: 36
Зарегистрирован: 31.01.13
|
|
Отправлено: 13.03.13 09:08. Заголовок: у меня около 30 разн..
у меня около 30 разных папок (архивировать в разные файлы) объёмом около 20гиг :(. Папки разные от нескольких десятков мег до 4-х с лишним гиг. Пока создается архив с самой большой папкой в параллельных процессах успевает заархивироваться всё остальное :) Так что "многопоточность форева!"
|
|
|
|
| |
Пост N: 37
Зарегистрирован: 31.01.13
|
|
Отправлено: 13.03.13 09:19. Заголовок: за ссылочку спасибо,..
за ссылочку спасибо, потестирую. А спрашивал потому, что когда-то на заре эры компьютеризации был такой архиватор, но тогда он значительно уступал arj, потом и rar'y
|
|
|
|
| постоянный участник
|
Пост N: 2737
Зарегистрирован: 12.09.06
|
|
Отправлено: 13.03.13 20:50. Заголовок: А почему остановилис..
А почему остановились на архиваторе 7z ? Есть же в МиниГуи zip-библиотеки. Запустить их в несколько потоков и пускай делают архив... Или каждый поток - определенное кол-во файлов или папок... На выбор и желание !
|
|
|
|
| |
Пост N: 2745
Зарегистрирован: 17.05.05
|
|
Отправлено: 13.03.13 23:31. Заголовок: rovix пишет: Если ж..
rovix пишет: цитата: | Если же запустить архивирование параллельно в пяти процессах, то минут 20 |
| При такой операции системка повиснет наглухо , бедный HDD..........придется менять его каждые пол годика (или чаще ). Попробуйте тем же Total Commander покопировать разные папки в разные точки назначения (в фоне каждый процесс) , или c Winrar проделайте ту же операцию. Проц грузится почти на все 100 , будь в нем хоть 20 ядер (ядреных) ;) Возможно с винтом SSD все обстоит не много лучше , не знаю не юзал. Мне кажется что нужно понимать когда и где юзать эту самую многопоточность. rovix пишет: цитата: | у меня около 30 разных папок (архивировать в разные файлы) объёмом около 20гиг :(. Папки разные от нескольких десятков мег до 4-х с лишним гиг. Пока создается архив с самой большой папкой в параллельных процессах успевает заархивироваться всё остальное :) Так что "многопоточность форева!" |
| А попробуйте то же самое сделать последовательно, папка за папкой (без потоков) . Будет какой то выигрыш по времени ?
|
|
|
|
| |
Пост N: 38
Зарегистрирован: 31.01.13
|
|
Отправлено: 14.03.13 11:43. Заголовок: Давайте попробуем пр..
Давайте попробуем представить что же происходит при многопользовательском доступе к базе данных с жестким диском на сервере... Система абсолютно не виснет, в менеджере задач явно видно какие ядра заняты 7zip`ом, не знаю почему, но на сервере 7zip не забирает все ядра под себя. Выигрыш по времени примерно четырехкратный. Andrey пишет: цитата: | А почему остановились на архиваторе 7z ? |
|
Из-за объёмов, 7zip сжимает значительно сильнее.
|
|
|
|
|
| постоянный участник
|
Пост N: 2744
Зарегистрирован: 12.09.06
|
|
Отправлено: 15.03.13 04:58. Заголовок: rovix пишет: Из-за ..
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х кратного выигрыша по времени! Пиши тогда автору программы, там и мыло его есть. О результатах потом сообщи....
|
|
|
|
| |
Пост N: 39
Зарегистрирован: 31.01.13
|
|
Отправлено: 15.03.13 18:23. Заголовок: Andrey, спасибо за т..
Andrey, спасибо за тесты, сам собирался проверить, но всё никак на работе запарка, думаю сегодня всё же вечерком проверю freearc в параллельном режиме. Однако не понял про какого автора идёт речь? Я же не 7zip улучшаю, а пытаюсь узнать как в харборе запускать параллельно несколько процессов и следить за ними. Под параллельно имеется ввиду системный запуск программы из харбора что-то типа Run().
|
|
|
|
| постоянный участник
|
Пост N: 2749
Зарегистрирован: 12.09.06
|
|
Отправлено: 15.03.13 19:01. Заголовок: rovix пишет: Однако..
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
|
|
|
|