AZJIO
надо пробовать, мне слабо верится что сработают оба условия (размер, FastMD)
да и что мешает добавить ещё одно условие FastMD2 с твоим вариантом подсчёта.. )
Поиск дубликатов файлов
Сообщений 31 страница 49 из 49
Поделиться3123.06.2022 19:16:54
Поделиться3223.06.2022 19:56:11
Это копирование значения
Сейчас потестировал с очисткой карты до вывода результата, результат был выведен, получается значит копирование.
Потестировал код с поиском хеша только в пределах одинаковых и время выполнения одинаковое. Но так как с временной картой я получил проблему CSV, так как она ранее добавлялась в этот массив данных, то теперь с временной картой я не могу сравнивать с CSV, поэтому версия с этим тестом откатывается к предыдущей.
мне слабо верится что сработают оба условия
теоретически я могу добавить сколько хочешь условий, ведь тест на размер это одно из условий, по результату которого одинарные отсеиваются, потом тест md5, по результатам которого одинарные отсеиваются. Это всего лишь шаг теста, на этапе которого можно отсеять часть файлов создающих проблему, то есть тест, который сделает проверку быстрее чем md5, как и тест размера происходит быстрее чем md5, так как запрашивается готовое число а не вычисляется и не читается файл.
Отредактировано AZJIO (23.06.2022 20:02:32)
Поделиться3323.06.2022 22:14:15
Как я понимаю карта при создании структур хранит указатель на структуру, а если я приравниваю, то по факту я думаю что присваиваю указатель
Код
ListMD5() = MapMD5()
эквивалентен
CopyStructure(MapMD5(), ListMD5(), StructureName)
То есть производится копирование структуры.
Это легко проверить.
NewMap MapMD5.POINT() NewList ListMD5.POINT() MapMD5("1234")\x=10 MapMD5("1234")\y=20 AddElement(ListMD5()) ListMD5() = MapMD5() ;CopyStructure(MapMD5(), ListMD5(), POINT) Debug ListMD5()\x Debug ListMD5()\y MapMD5("1234")\x=0 MapMD5("1234")\y=200 Debug ListMD5()\x Debug ListMD5()\y
Если бы копировался указатель, то поменяв данные в ассоциативном массиве, они бы изменились и в списке, но этого не происходит, т. к. разные экземпляры структуры.
Вот копирование указателя.
NewMap MapMD5.POINT() NewList *ListMD5.POINT() MapMD5("1234")\x=10 MapMD5("1234")\y=20 AddElement(*ListMD5()) *ListMD5() = @MapMD5() Debug *ListMD5()\x Debug *ListMD5()\y MapMD5("1234")\x=0 MapMD5("1234")\y=200 Debug *ListMD5()\x Debug *ListMD5()\y
Поделиться3423.06.2022 22:41:19
Скомпилировал на Linux тоже и пакеты собрал.
Всё-таки тест с отдельной временной картой для одноразмерных вполне возможен без потери CSV, так как можно просто вторым условием (And) выполнить проверку во второй карте созданной на основе файлов CSV. Вот только скорость не улучшилась, не пойму почему. На линукс первое сканирование этой же папки (что на винде 35 сек) было 2,5 минут, а второе сканирование почти мгновенно, 20 сек, а то и меньше.
Поделиться3523.06.2022 22:45:54
На линукс первое сканирование этой же папки (что на винде 35 сек) было 2,5 минут, а второе сканирование почти мгновенно, 20 сек, а то и меньше.
Файловая система? Если FAT32/NTFS, то неудивительно.
При втором сканировании, файлы были в памяти и вероятно обращение к диску не осуществлялось.
Поделиться3623.06.2022 22:57:28
Закинул исходник "Search_duplicates-List (структура с tmp, тест).pb" с временной картой для теста, если есть желание тестировать у кого, а я уже буду ковырять только завтра вечером. Сранивать наверно с линуксовым исходником, так как виндовый уже с потоком и разница только в потоке.
Поделиться3725.06.2022 16:28:44
Обновление
Исправление вывода с использованием CSV.
Добавление времени поиска результатов в строку состояния.
Ранее если вставить CSV, то сравнивался только md5, то есть фактически те что не дубликаты не сравнивались с CSV и не попадали как дубликаты. Теперь сравнение CSV на этапе размеров и теперь если у файла нет реальных дубликатов он всё таки попадает вместе с CSV. Грубо говоря если в папке ни одного дубликата, то ранее сравнение с CSV также ничего не даст, сейчас же если сохранить эту папку в CSV, и добавить его для сравнения, то все файлы папки попадут на вывод, так как они есть в CSV.
Отредактировано AZJIO (26.06.2022 07:46:20)
Поделиться3827.06.2022 19:09:15
Пётр
Для файла 420 Мб на шпидельном диске скорость вычисления md5 - 2 сек, а псевдохеш 0,2 сек, в 10 раз быстрее. При повторном вычислении (при кешированных адресах на диске) md5 - 850 мс, а псевдохеш - 0 мс. Остаётся найти баланс для какого размера вычислять псевдохеш, понятно что для мелких файлов md5 начнёт выигрывать, так как функция псевдохеша всё же тратит время на вычисление и создание промежуточных Карт на сравнение.
DisableDebugger - практически не влияет на результат.
EnableExplicit UseMD5Fingerprint() Define Path$, StartTime, Res.s, md5$ Procedure.s GetPseudoHash(Path$, Shift.q) Protected res$, length, file_id file_id = ReadFile(#PB_Any, Path$) If file_id length = Lof(file_id) FileSeek(file_id, 4, #PB_Relative) While Eof(file_id) = 0 res$ + Hex(ReadByte(file_id), #PB_Byte) FileSeek(file_id, Shift, #PB_Relative) Wend FileSeek(file_id, length - 1, #PB_Absolute) res$ + Hex(ReadByte(file_id), #PB_Byte) CloseFile(file_id) EndIf ProcedureReturn res$ EndProcedure Path$ = "путь_к_фильму" StartTime=ElapsedMilliseconds() md5$ = GetPseudoHash(Path$, FileSize(Path$) / 31) Res = "скорость хеш0 => " + Str(ElapsedMilliseconds()-StartTime) + " мсек" MessageRequester("хеш0", md5$ + #LF$ + #LF$ + Res) Path$ = "путь_к_фильму_того_же_размера_но_иной_чтобы_не_хешировался" StartTime=ElapsedMilliseconds() md5$ = FileFingerprint(Path$, #PB_Cipher_MD5) Res = "скорость md5 => " + Str(ElapsedMilliseconds()-StartTime) + " мсек" MessageRequester("md5", md5$ + #LF$ + #LF$ + Res)
И перезалил архив, пока не пересобирал пакеты Linux. Надо сгенерировать одинакового размера файлы штук 1000 и тестировать, когда скорость вычисления начнёт ухудшаться и это размер выставить. Сейчас 50 кб. Теперь папка с сериалом вычисляется 20 сек. И понятно что 200 серий умножить на 0,2 сек, получаем 40 сек, поправка что там 158 серий и что 0.2 это не точно. А с md5 у меня вообще несколько минут вычислял и потом в итоге упал.
Отредактировано AZJIO (28.06.2022 04:48:31)
Поделиться3929.06.2022 10:28:57
Обновление
Добавлен выбор уровня приоритета без ограничения
Добавлено удаление пункта из окна выбора поиска
Добавлен цвет групп (в ini)
Добавлен параметр PseudoHashSize в ini
Добавлено сохранение результатов в файл (чтобы сравнить результаты Linux и Windows)
Поделиться4030.06.2022 15:52:35
Обновление в Windows-версии
Добавил фильтр и скрытие чекбоксов для групп.
Поделиться4130.06.2022 15:55:23
псевдохеш
Не думаю что 32 байта из файла смогут дать объективную картину уникальности данных.
Поделиться4230.06.2022 16:44:03
Пётр
Он даёт не уникальность файла, а различие. Точнее подтверждает не уникальность а различие. То есть если на этапе быстрого хеша подтверждается различие, то нет смысла отправлять пару на проверку дубликатов с помощью md5. То есть если псевдохеш одинаков это всё равно отправляется на проверку md5 (так как у всех дублей в выводе есть md5).
Я опять попробовал поток на линукс, так как мне хочется иметь один исходник, а не импортировать обновы в другой исходник, и в итоге на линуксе падает на MessageRequester, так как закоментировав это строку в функции Compare прога не падает. Вот думаю стоит ли разделить функцию на 2 участка до и после MessageRequester, чтобы обеспечить поток и не всплывёт ли другой проблемы, так как ранее у меня падала прога явно по другой проблеме, так как MessageRequester я добавил в этом месяце.
Пётр
Кстати я понял задержки первого доступа для псевдохеша: при доступе к каждому байту прыжками 32 раза это равносильно доступа к 32-файлам. То есть второй раз это происходит быстро потому что эти адреса байтов 32 штук сохраняются видимо в кеше. То есть он кеширует не просто адреса файлов, а адреса обращений. Если последовательно читал файл с диска, то запоминает адрес начала, а при дефрагментированном файле запоминает адреса каждого фрагмента. Иначе скорость бы не менялась для одного файла.
Отредактировано AZJIO (30.06.2022 16:52:18)
Поделиться4330.06.2022 16:50:15
Для поиска дубликатов неплохо бы реализовать предпросмотр файлов - так сделано в платной Fast Duplicate File Finder
Поделиться4430.06.2022 16:53:32
egons
в контекстном меню результатов есть пункт прыгнуть в папку файла и открыть в ассоциированной программе. Так что предпросмотр как таковой есть.
Перезалил, для исходника добавил иконку и pbi. И исходник линукса обновил и собрал пакет арчу.
Отредактировано AZJIO (30.06.2022 17:31:44)
Поделиться4530.06.2022 17:47:33
на линуксе падает на MessageRequester
Всю работу с окнами нужно производить в одном потоке.
GTK не потокобезопасна.
То есть он кеширует не просто адреса файлов, а адреса обращений.
Данные кеширует.
Поделиться4630.06.2022 18:12:45
Данные кеширует.
если там память 32-64 Мб, как он данные будет кешировать? Я к примеру делаю поиск 10 000 файлов, некоторые из которых даже не влезут в кеш и он как бы не читает файлы, а только обращается к таблице MFT. И как он кеширует файл 420 Мб?
Поделиться4730.06.2022 23:33:23
если там память 32-64 Мб, как он данные будет кешировать?
В компе 64 МБ ОЗУ?
И как он кеширует файл 420 Мб?
Копирует в ОЗУ если есть свободное место.
Поделиться4830.06.2022 23:57:10
Пётр
память находится на самом жёстком диске, на плате/контроллере.
https://onoutbukax.ru/chto-takoe-kesh-p … na-nuzhna/
Поделиться4901.07.2022 10:49:43
Я про кеш операционной системы. Он может достигать размера почти всей свободной оперативной памяти.
Похожие темы
Поиск файлов | PureBasic для Windows | 10.03.2023 |
Unique Password - уникальный пароль | PureBasic для Windows | 17.06.2022 |
Ищу наставника (ментора). | PureBasic для Windows | 27.07.2022 |
Улучшение справки | PureBasic для Windows | 01.03.2025 |