![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
tarasD |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 5.5.2007 Репутация: нет Всего: 1 |
Как програмными средствами сравнить примерно 50 тисяч файлов на идентичность, при этом размер файла может достигать размеров до 2 ГБ.
|
|||
|
||||
Azzdorf |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 190 Регистрация: 29.3.2007 Репутация: нет Всего: нет |
каким образом сравнить???
по размеру или есть другие параметры???? --------------------- А мо есть конкретное задание - типа найти пару одинаковых??????? Это сообщение отредактировал(а) Azzdorf - 21.11.2007, 19:00 --------------------
Иногда шаг вперед - это результат хорошего пинка под зад. |
|||
|
||||
marcusmae |
|
|||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 22 Всего: 39 |
tarasD, если возможно два варианта идентичны и неидентичны, то считайте с файлов хеш суммы (CRC или MD5) и сравнивайте их - если будут равны, то файлы идентичны.
-------------------- ἀπὸ μηχανῆς θεός |
|||
|
||||
Domovik |
|
|||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 21.7.2007 Репутация: нет Всего: нет |
marcusmae, ну для 50 тыс. файлов делать md5 - это жестоко (особенно если учесть возможный размер файлов). Но похоже это единственный приемлемый метод в данной ситуации (ускоряет сравнение в десятки раз). Просто стоит сначала проверять размеры сравниваемых файлов, так как 10кб тхт файл не может быть идентичен 4Гб iso-образу
![]() PS никто не знает, есть ли в .Net средства для получения СRC или MD5? Изначально благодарен за ответ. |
|||
|
||||
stab |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1839 Регистрация: 1.1.2003 Репутация: 22 Всего: 48 |
MD5 - System.Security.Cryptography.MD5, CRC вроде нет. В любом случае, я бы ручками их сделал, т.к. у меня большие сомнения в производительности стандартной реализации.
-------------------- 6, 6, 6 - the number of the beast. |
|||
|
||||
Azzdorf |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 190 Регистрация: 29.3.2007 Репутация: нет Всего: нет |
tarasD было бы проще если бы точнее описал задание - тут бы и исходничек родился, но Domovikпоходу прав, если большой разброс по размеру файлов - я бы разбил файлы на несколько груп по размеру, что-бы оптимизировать в плане скорости
например там файлы до 1000кб 1000кб-10мб 10мб-100мб выше 100мб а потом прогнать if-оператором при помощи сравнения with use MD5 думаю так будет быстрее ![]() --------------------
Иногда шаг вперед - это результат хорошего пинка под зад. |
|||
|
||||
tarasD |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 5.5.2007 Репутация: нет Всего: 1 |
Я написал через md5. Программа считает 40 минут 60 тисяч файлов, а надо за 5 минут. Причем я учитивал такой вариант когда два файла за размером не равни, то соответственно файли не равни.
|
|||
|
||||
Azzdorf |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 190 Регистрация: 29.3.2007 Репутация: нет Всего: нет |
попробуй вариант с группами - мож реально поможет(притом что МД5 долго)
может есть смысл до 10 или 100 метров сравнивать по МД5 а после по размеру - должно ускорить (попробуй звять для сравнения только файлы до 10 метров и посмотреть сколько выйдет их сравнение через МД5) также вопросик какого размера в основном файлы???? и где содержаться файлы и как часто необходимо проводить такое сравнение??? ![]() --------------------
Иногда шаг вперед - это результат хорошего пинка под зад. |
|||
|
||||
marcusmae |
|
|||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 22 Всего: 39 |
Узкие места : 1) КОД Если под .NET пишите, то неудивительно, что медленно. Возьмите какую-нибудь из программок, проверяющих контрольные суммы (коих бесчисленное множество, например, эта) и сравните их скорость со своей программой на каком-нибудь одном файле. Прирост скорости могла бы дать реализация под native С. Если всё грамотно сделать, то ускорение в 8 раз в принципе достижимо ![]() 2) ДИСК Магнитные диски работают медленно и, чтобы добиться большего, нужно упорядочивать файлы. Ко множеству мелких файлов долго обращаться по файловой системе. Можно объединить в более крупные архивы (или "непрерывные" файлы другого вида) - возможно, будет жеваться быстрее. Этим или другим образом желательно добиться того, чтобы данные, которые Вы анализируете были бы как можно меньше фрагментированы по диску. Это сообщение отредактировал(а) marcusmae - 22.11.2007, 21:31 -------------------- ἀπὸ μηχανῆς θεός |
|||
|
||||
Azzdorf |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 190 Регистрация: 29.3.2007 Репутация: нет Всего: нет |
может сделать как на многих крупных серверах - создать файл-регистр, к котором хранить даные о файле (расположение, размер...) и в т.ч. МД5 - у по надобности пробигать и сравнивать???
или общая задача другая???? --------------------
Иногда шаг вперед - это результат хорошего пинка под зад. |
|||
|
||||
ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
Да, этот вариант мне тоже по душе. 1) За первый прогон создать "индексный" файл с инфой "файл & размер". 2) Потом пройтись по файлу и найти группы файлов с одинаковым размером (групп будет не много, потому что почти нереально, чтобы разные файлы содержали одинаковое количество байт). 3) Каждую группу проверить MD5. |
|||
|
||||
marcusmae |
|
|||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 22 Всего: 39 |
Хм, не годится : файлы можно будет подменить. По размеру Вы не определите, произошло ли это. -------------------- ἀπὸ μηχανῆς θεός |
|||
|
||||
ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
Это может произойти в любой момент сравнения. Какой бы алгоритм ты ни избрал ![]() P.S. marcusmae, по контексту понятно, что ты подразумеваешь что-то особенное под "подменить". Только вот я не пробью что ![]() Давай на ты Добавлено через 42 секунды
Кста, "файл" спокойно поместится в оперативке |
|||
|
||||
1stain |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 486 Регистрация: 30.7.2007 Где: Киев - Харьков Репутация: 8 Всего: 40 |
как вариант, если есть сервер с базой данных, занести туда записи для всех контролируемых файлов. При первом прогоне - проверить все фалы на идентичность, поставить отметку в полях "synchronized" & "equal". Далее, на кадой машине, где лежат проверяемые файлы крутицца сервис виндовз, который в рантайме отслеживает изменение файлов с помощью FileSystemWatcher и сбрасывает в базе у записи, соответстующей измененному файлу признак "synchronized". При проведении очередной проверки, проверяем только те записи, у которых сброшен "synchronized" и после проверки опять же его поднимаем...
з.ы. правда, при каждом запуске сервиса, он должен определить, были ли изменены проверяемые файлы за время его (сервиса) простоя Это сообщение отредактировал(а) 1stain - 23.11.2007, 12:10 -------------------- Все знают, что это невозможно. Но вот приходит невежда, которому это неизвестно - он-то и делает открытие. (Albert Einstein) ![]() |
|||
|
||||
marcusmae |
|
||||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 22 Всего: 39 |
Ну можно, действительно, нехитрым сишным кодом подвинуть дату модификации файлов лет эдак на десять в прошлое или в будущее ![]()
Так, и что? = Алгоритм подмену заметит, а твой индексер просто выдаст значение из базы и будет неправ. Или, как предлагает 1stain, кеширование должно работать в связке с системными сервисами по доступу к файловой системе. Типа, уже почти Windows Vista ![]() -------------------- ἀπὸ μηχανῆς θεός |
||||
|
|||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |