marat_
Шеф-повар
Опытный
Offline
|
|
« : 08-04-2008 05:34 » |
|
привет всем! озаботился такой проблемой - небоходима функция в программе для поиска дубликатов файлов, должна выдать все файлы, количество которых больше 1, и пути к их копиям. как это сделать я представляю, мне страшно становится от размеров рабочих данных! кто-нибудь занимался подобной вещью?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #1 : 08-04-2008 06:10 » |
|
я не занимался, но можно сделать сравнение по контрольной сумме и размеру файла. Вести мини-базу данных в озу )
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #2 : 08-04-2008 06:18 » |
|
По-моему, наиболее очевидно начинать проверку со сверки размеров файла. Если у тебя дубликатов будет не слишком много, то едва ли слишком часто будет совпадать размер. Для тех, которые совпадают, думаю, проверку можно начинать поблочно - опять же, едва ли кроме случая умышленно незначительно модифицированной версии того же файла, что-то другое будет совпадать настолько точно, что придётся дочитать до конца файла
|
|
|
Записан
|
|
|
|
McZim
|
|
« Ответ #3 : 08-04-2008 06:56 » |
|
смысл создания темы мне не понятен? Нужна функция поиска дубликатов файлов, причем как утверждает автор, он знает как ее сделать, но чего то боится, мне лично не понятно чего.
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
marat_
Шеф-повар
Опытный
Offline
|
|
« Ответ #4 : 08-04-2008 07:14 » |
|
объясню. файлов ~5-6 милионов, могут присутствовать различные форматы, но в основном - изображения bmp большой размерности (размер файла у них одинаков). функция мне нужна, но интересует опыт тех, кто сталкивался с подобными вещами. если хранить в озу - свопить будет, скорость упадёт, если скидывать в файл - аналогично. вот и хочется сначала узнать об ошибках, чтобы потом на них не споткнуться.
|
|
« Последнее редактирование: 08-04-2008 07:18 от marat_ »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #5 : 08-04-2008 07:17 » |
|
озу ты не забьёшь имхо )
|
|
|
Записан
|
|
|
|
marat_
Шеф-повар
Опытный
Offline
|
|
« Ответ #6 : 08-04-2008 07:18 » |
|
в смысле? при самых скромных подсчётах размер данных составит более гигабайта
|
|
« Последнее редактирование: 08-04-2008 07:21 от marat_ »
|
Записан
|
|
|
|
Вад
|
|
« Ответ #7 : 08-04-2008 07:25 » |
|
marat_, изложи подсчёт что именно считаешь?
|
|
|
Записан
|
|
|
|
marat_
Шеф-повар
Опытный
Offline
|
|
« Ответ #8 : 08-04-2008 07:43 » |
|
считаем md5 - 128 бит + путь - 260 байт умножаем на 5 млн получаем
|
|
|
Записан
|
|
|
|
McZim
|
|
« Ответ #9 : 08-04-2008 07:46 » |
|
мне кажется что для скорости тебе нужно юзать потоки, а для хранения ты должен для себя решить где ты и что хочешь хранить а уж потом спрашивать про грабли.
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
Вад
|
|
« Ответ #10 : 08-04-2008 07:48 » |
|
Для твоего решения, как минимум, оптимизация: хранить не весь путь к каждому файлу, а древовидную структуру для вложенных директорий. в каждом узле дерева - имя директории, перечень файлов с их md5 и вложенные блоки субдиректорий с той же структурой. Тогда для всех файлов в подкаталоге путь будет один раз записан.
|
|
« Последнее редактирование: 08-04-2008 07:55 от Вад »
|
Записан
|
|
|
|
marat_
Шеф-повар
Опытный
Offline
|
|
« Ответ #11 : 08-04-2008 07:55 » |
|
в принципе, я так и думал... но хранить всё таки мыслю в озу, файл больше гига не очень пригоден для чтения\записи
|
|
|
Записан
|
|
|
|
McZim
|
|
« Ответ #12 : 08-04-2008 07:57 » |
|
marat_, а до какого момента вы хотите это дело хранить в оперативной памяти?
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
marat_
Шеф-повар
Опытный
Offline
|
|
« Ответ #13 : 08-04-2008 08:02 » |
|
кстати, уточнение, хеш будет sha256. хранить думал до окончания подсчёта всех файлов, потом потихоньку подчищать по мере прохождения и анализа.McZim, если вам не трудно, обращайтесь ко мне на "ты". я и "вы" - несовместимы.
|
|
|
Записан
|
|
|
|
McZim
|
|
« Ответ #14 : 08-04-2008 08:04 » |
|
marat_, может лучше будет использовать для этого дела именованные каналы? Да кстате ОС какая?
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
marat_
Шеф-повар
Опытный
Offline
|
|
« Ответ #15 : 08-04-2008 08:05 » |
|
интересный вопрос... даже не соображу...
ps винда, родимая
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #16 : 08-04-2008 08:06 » |
|
marat_ , а пути можно хранить в виде дерева, много префиксов будет одинаковых.
Вад опередил )
|
|
|
Записан
|
|
|
|
McZim
|
|
« Ответ #17 : 08-04-2008 08:07 » |
|
marat_, к сожалению не знаю как эти каналы устроены в Windows, но знаю как в Linux скажите у вас ОС какая, для котороы вы будете писать данное приложение.
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #18 : 08-04-2008 08:08 » |
|
McZim, а при чём каналы ? Я тоже в груз
|
|
|
Записан
|
|
|
|
marat_
Шеф-повар
Опытный
Offline
|
|
« Ответ #19 : 08-04-2008 08:09 » |
|
ну вот! а вы говорите! сколько уже полезных советов! McZim, предполагается xp2sp. ещё раз прошу, не надо "вы", раздражает, ей-богу!
|
|
|
Записан
|
|
|
|
McZim
|
|
« Ответ #20 : 08-04-2008 08:12 » |
|
Алексей1153++, я так понимаю marat_, в дальнейшем будет хранить полученный результат найденных файлов или их количество где то для дальнейшей обработки, так вот я думаю что бы не пихать сначала во временный буфер в памяти и беспокоится о занимаемом месте, а потом выбирать это дело куда то, думаю проще будет помещать результат в канал а уже из канала ложить в долговременное хранилище, при этом канал распологается в ФС и не нужно беспокоится о ОЗУ.
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
marat_
Шеф-повар
Опытный
Offline
|
|
« Ответ #21 : 08-04-2008 08:23 » |
|
даа, хитрость города берёт! сначала, всё таки, анализ размеров и расширений будет совсем не лишним... а потом уже среди одинаковых размеров считать хеши
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #22 : 08-04-2008 08:26 » |
|
Если у тебя гарантированно за время проверки никто не добавит без твоего ведома новый файл или каталог, то можешь хранить не имена файлов и каталогов, а порядковые номера в алфавитном порядке, например. Места сэкономишь уйму
|
|
|
Записан
|
|
|
|
marat_
Шеф-повар
Опытный
Offline
|
|
« Ответ #23 : 08-04-2008 08:30 » |
|
да, мне такая мысль тоже в голову приходила
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #24 : 08-04-2008 08:35 » |
|
marat_, решение большенства задач упрошается, если правильно выбрать и организовать данные. какие данные нам нужны? 1. Пути к файлам пускай строки длиннной до 256 символов 2. размер файла long - 4 байта 3. иногда контрольная сумма еще 32 байта имеем до ~300 байт на файл 6E6 файлов итого 2 гига. решение 1. использовать БД(BerkeleyDB подойдёт) решение 2. снизить потребности например засчет, уменьшения расходов на хранение пути к файлу(хранить в виде дерева, аналогичного дереву каталогов), экономим 220 байт на файл, т.е где, то 500-600 мег на 6E6 файлов вариант с БД мне нравится больше, конечно страдает скорость, но резко снижаются требования к памяти. можно наверняка еще, что нибуть придумать собственно вы это уже по обсуждали, пока я сообщение писал
|
|
« Последнее редактирование: 08-04-2008 08:37 от LogRus »
|
Записан
|
Странно всё это....
|
|
|
McZim
|
|
« Ответ #25 : 08-04-2008 08:37 » |
|
LogRus, можно так же использовать SQLite БД очень шустрая
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
Антон (LogRus)
|
|
« Ответ #26 : 08-04-2008 08:44 » |
|
McZim, с чем работал про то и говорю
|
|
|
Записан
|
Странно всё это....
|
|
|
marat_
Шеф-повар
Опытный
Offline
|
|
« Ответ #27 : 08-04-2008 08:47 » |
|
не, бд юзать нельзя. программа должна быть самодостаточной. а вот ещё средство экономии: использоватть досовские пути к файлам. в основе решение уже сформировалось, надо переспать, а там мозг и детали придумает. всем бАльшое спасибо!!!
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #28 : 08-04-2008 09:26 » |
|
Пути можно выделить в отдельную таблицу, а в основную числовой идентификатор вставлять. Так и компактнее, и с деревьями не надо возиться.
Размер файла может быть больше 4ГБ.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Антон (LogRus)
|
|
« Ответ #29 : 09-04-2008 04:08 » |
|
marat_, BerkeleyDB позволяет или тащить с прогой только одну dll или статически слинковать её с твой прогой(500 кило весит всеголишь). я бы постороил, дерево путей, проставляя уникальные номера файлам, контрольную сумму или размер файла использовал бы в качестве ключа к БД, далее прошелся бы курсором по всей BerkeleyDB, файлы с одинаковой длинной или контрольной суммой будут идти подряд(это гарантирует БД), если нашел дубликаты, делал бы доп.проверки на совпадение и по номерам файлов находил бы их имена, кстати контрольную сумму можно считать не по всему файлу. ну это как бы сделал я, но коллективный разум наверняка найдёт более изящьные решения.
|
|
|
Записан
|
Странно всё это....
|
|
|
|