PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » PureBasic для Windows » Поиск дубликатов файлов


Поиск дубликатов файлов

Сообщений 31 страница 49 из 49

31

AZJIO
надо пробовать, мне слабо верится что сработают оба условия (размер, FastMD)
да и что мешает добавить ещё одно условие FastMD2 с твоим вариантом подсчёта.. )

0

32

Пётр написал(а):

Это копирование значения

Сейчас потестировал с очисткой карты до вывода результата, результат был выведен, получается значит копирование.

Потестировал код с поиском хеша только в пределах одинаковых и время выполнения одинаковое. Но так как с временной картой я получил проблему CSV, так как она ранее добавлялась в этот массив данных, то теперь с временной картой я не могу сравнивать с CSV, поэтому версия с этим тестом откатывается к предыдущей.

Lin написал(а):

мне слабо верится что сработают оба условия

теоретически я могу добавить сколько хочешь условий, ведь тест на размер это одно из условий, по результату которого одинарные отсеиваются, потом тест md5, по результатам которого одинарные отсеиваются. Это всего лишь шаг теста, на этапе которого можно отсеять часть файлов создающих проблему, то есть тест, который сделает проверку быстрее чем md5, как и тест размера происходит быстрее чем md5, так как запрашивается готовое число а не вычисляется и не читается файл.

Отредактировано AZJIO (23.06.2022 20:02:32)

0

33

AZJIO написал(а):

Как я понимаю карта при создании структур хранит указатель на структуру, а если я приравниваю, то по факту я думаю что присваиваю указатель

Код

Код:
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

0

34

Скомпилировал на Linux тоже и пакеты собрал.

Всё-таки тест с отдельной временной картой для одноразмерных вполне возможен без потери CSV, так как можно просто вторым условием (And) выполнить проверку во второй карте созданной на основе файлов CSV. Вот только скорость не улучшилась, не пойму почему. На линукс первое сканирование этой же папки (что на винде 35 сек) было 2,5 минут, а второе сканирование почти мгновенно, 20 сек, а то и меньше.

0

35

AZJIO написал(а):

На линукс первое сканирование этой же папки (что на винде 35 сек) было 2,5 минут, а второе сканирование почти мгновенно, 20 сек, а то и меньше.

Файловая система? Если FAT32/NTFS, то неудивительно.
При втором сканировании, файлы были в памяти и вероятно обращение к диску не осуществлялось.

0

36

Закинул исходник "Search_duplicates-List (структура с tmp, тест).pb" с временной картой для теста, если есть желание тестировать у кого, а я уже буду ковырять только завтра вечером. Сранивать наверно с линуксовым исходником, так как виндовый уже с потоком и разница только в потоке.

0

37

Обновление
Исправление вывода с использованием CSV.
Добавление времени поиска результатов в строку состояния.

Ранее если вставить CSV, то сравнивался только md5, то есть фактически те что не дубликаты не сравнивались с CSV и не попадали как дубликаты. Теперь сравнение CSV на этапе размеров и теперь если у файла нет реальных дубликатов он всё таки попадает вместе с CSV. Грубо говоря если в папке ни одного дубликата, то ранее сравнение с CSV также ничего не даст, сейчас же если сохранить эту папку в CSV, и добавить его для сравнения, то все файлы папки попадут на вывод, так как они есть в CSV.

Отредактировано AZJIO (26.06.2022 07:46:20)

0

38

Пётр
Для файла 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)

0

39

Обновление
Добавлен выбор уровня приоритета без ограничения
Добавлено удаление пункта из окна выбора поиска
Добавлен цвет групп (в ini)
Добавлен параметр PseudoHashSize в ini
Добавлено сохранение результатов в файл (чтобы сравнить результаты Linux и Windows)

0

40

Обновление в Windows-версии
Добавил фильтр и скрытие чекбоксов для групп.

0

41

AZJIO написал(а):

псевдохеш

Не думаю что 32 байта из файла смогут дать объективную картину уникальности данных.

0

42

Пётр
Он даёт не уникальность файла, а различие. Точнее подтверждает не уникальность а различие. То есть если на этапе быстрого хеша подтверждается различие, то нет смысла отправлять пару на проверку дубликатов с помощью md5. То есть если псевдохеш одинаков это всё равно отправляется на проверку md5 (так как у всех дублей в выводе есть md5).

Я опять попробовал поток на линукс, так как мне хочется иметь один исходник, а не импортировать обновы в другой исходник, и в итоге на линуксе падает на MessageRequester, так как закоментировав это строку в функции Compare прога не падает. Вот думаю стоит ли разделить функцию на 2 участка до и после MessageRequester, чтобы обеспечить поток и не всплывёт ли другой проблемы, так как ранее у меня падала прога явно по другой проблеме, так как MessageRequester я добавил в этом месяце.

Пётр
Кстати я понял задержки первого доступа для псевдохеша: при доступе к каждому байту прыжками 32 раза это равносильно доступа к 32-файлам. То есть второй раз это происходит быстро потому что эти адреса байтов 32 штук сохраняются видимо в кеше. То есть он кеширует не просто адреса файлов, а адреса обращений. Если последовательно читал файл с диска, то запоминает адрес начала, а при дефрагментированном файле запоминает адреса каждого фрагмента. Иначе скорость бы не менялась для одного файла.

Отредактировано AZJIO (30.06.2022 16:52:18)

0

43

Для поиска дубликатов неплохо бы реализовать предпросмотр файлов - так сделано в платной Fast Duplicate File Finder

0

44

egons
в контекстном меню результатов есть пункт прыгнуть в папку файла и открыть в ассоциированной программе. Так что предпросмотр как таковой есть.

Перезалил, для исходника добавил иконку и pbi. И исходник линукса обновил и собрал пакет арчу.

Отредактировано AZJIO (30.06.2022 17:31:44)

0

45

AZJIO написал(а):

на линуксе падает на MessageRequester

Всю работу с окнами нужно производить в одном потоке.
GTK не потокобезопасна.

AZJIO написал(а):

То есть он кеширует не просто адреса файлов, а адреса обращений.

Данные кеширует.

0

46

Пётр написал(а):

Данные кеширует.

если там память 32-64 Мб, как он данные будет кешировать? Я к примеру делаю поиск 10 000 файлов, некоторые из которых даже не влезут в кеш и он как бы не читает файлы, а только обращается к таблице MFT. И как он кеширует файл 420 Мб?

0

47

AZJIO написал(а):

если там память 32-64 Мб, как он данные будет кешировать?

В компе 64 МБ ОЗУ?

AZJIO написал(а):

И как он кеширует файл 420 Мб?

Копирует в ОЗУ если есть свободное место.

0

48

Пётр
память находится на самом жёстком диске, на плате/контроллере.
https://onoutbukax.ru/chto-takoe-kesh-p … na-nuzhna/

0

49

Я про кеш операционной системы. Он может достигать размера почти всей свободной оперативной памяти.

0


Вы здесь » PureBasic - форум » PureBasic для Windows » Поиск дубликатов файлов