Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: нужна функция поиска дубликатов файлов  (Прочитано 22424 раз)
0 Пользователей и 1 Гость смотрят эту тему.
marat_
Шеф-повар
Опытный

ru
Offline Offline

« : 08-04-2008 05:34 » 

привет всем!
озаботился такой проблемой - небоходима функция в программе для поиска дубликатов файлов, должна выдать все файлы, количество которых больше 1, и пути к их копиям. как это сделать я представляю, мне страшно становится от размеров рабочих данных!
кто-нибудь занимался подобной вещью?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 08-04-2008 06:10 » 

я не занимался, но можно сделать сравнение по контрольной сумме и размеру файла. Вести мини-базу данных в озу )
Записан

Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 08-04-2008 06:18 » 

По-моему, наиболее очевидно начинать проверку со сверки размеров файла. Если у тебя дубликатов будет не слишком много, то едва ли слишком часто будет совпадать размер. Для тех, которые совпадают, думаю, проверку можно начинать поблочно - опять же, едва ли кроме случая умышленно незначительно модифицированной версии того же файла, что-то другое будет совпадать настолько точно, что придётся дочитать до конца файла Улыбаюсь
Записан
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #3 : 08-04-2008 06:56 » 

смысл создания темы мне не понятен? Нужна функция поиска дубликатов файлов, причем как утверждает автор, он знает как ее сделать, но чего то боится, мне лично не понятно чего.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
marat_
Шеф-повар
Опытный

ru
Offline Offline

« Ответ #4 : 08-04-2008 07:14 » 

объясню. файлов ~5-6 милионов, могут присутствовать различные форматы, но в основном -  изображения bmp большой размерности (размер файла у них одинаков). функция мне нужна, но интересует опыт тех, кто сталкивался с подобными вещами. если хранить в озу - свопить будет, скорость упадёт, если скидывать в файл - аналогично. вот и хочется сначала узнать об ошибках, чтобы потом на них не споткнуться.
« Последнее редактирование: 08-04-2008 07:18 от marat_ » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 08-04-2008 07:17 » 

озу ты не забьёшь имхо )
Записан

marat_
Шеф-повар
Опытный

ru
Offline Offline

« Ответ #6 : 08-04-2008 07:18 » 

в смысле?
при самых скромных подсчётах размер данных составит более гигабайта
« Последнее редактирование: 08-04-2008 07:21 от marat_ » Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 08-04-2008 07:25 » 

marat_, изложи подсчёт Улыбаюсь что именно считаешь?
Записан
marat_
Шеф-повар
Опытный

ru
Offline Offline

« Ответ #8 : 08-04-2008 07:43 » 

считаем md5 - 128 бит
+ путь - 260 байт
умножаем на 5 млн
получаем
Записан
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #9 : 08-04-2008 07:46 » 

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

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 08-04-2008 07:48 » 

Для твоего решения, как минимум, оптимизация: хранить не весь путь к каждому файлу, а древовидную структуру для вложенных директорий. в каждом узле дерева - имя директории, перечень файлов с их md5 и вложенные блоки субдиректорий с той же структурой. Тогда для всех файлов в подкаталоге путь будет один раз записан.
« Последнее редактирование: 08-04-2008 07:55 от Вад » Записан
marat_
Шеф-повар
Опытный

ru
Offline Offline

« Ответ #11 : 08-04-2008 07:55 » 

в принципе, я так и думал...
но хранить всё таки мыслю в озу, файл больше гига не очень пригоден для чтения\записи
Записан
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #12 : 08-04-2008 07:57 » 

marat_, а до какого момента вы хотите это дело хранить в оперативной памяти?
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
marat_
Шеф-повар
Опытный

ru
Offline Offline

« Ответ #13 : 08-04-2008 08:02 » 

кстати, уточнение, хеш будет sha256. хранить думал до окончания подсчёта всех файлов, потом потихоньку подчищать по мере прохождения и анализа.McZim, если вам не трудно, обращайтесь ко мне на "ты". я и "вы" - несовместимы.
Записан
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #14 : 08-04-2008 08:04 » 

marat_, может лучше будет использовать для этого дела именованные каналы? Да кстате ОС какая?
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
marat_
Шеф-повар
Опытный

ru
Offline Offline

« Ответ #15 : 08-04-2008 08:05 » 

интересный вопрос... даже не соображу...

ps винда, родимая
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #16 : 08-04-2008 08:06 » 

marat_ , а пути можно хранить в виде дерева, много префиксов будет одинаковых.

Вад опередил )
Записан

McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #17 : 08-04-2008 08:07 » 

marat_, к сожалению не знаю как эти каналы устроены в Windows, но знаю как в Linux скажите у вас ОС какая, для котороы вы будете писать данное приложение.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #18 : 08-04-2008 08:08 » 

McZim, а при чём каналы ? Улыбаюсь Я тоже в груз
Записан

marat_
Шеф-повар
Опытный

ru
Offline Offline

« Ответ #19 : 08-04-2008 08:09 » 

ну вот! а вы говорите! сколько уже полезных советов!
McZim, предполагается xp2sp. ещё раз прошу, не надо "вы", раздражает, ей-богу!
Записан
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #20 : 08-04-2008 08:12 » 

Алексей1153++, я так понимаю marat_, в дальнейшем будет хранить полученный результат найденных файлов или их количество где то для дальнейшей обработки, так вот я думаю что бы не пихать сначала во временный буфер в памяти и беспокоится о занимаемом месте, а потом выбирать это дело куда то, думаю проще будет помещать результат в канал а уже из канала ложить в долговременное хранилище, при этом канал распологается в ФС и не нужно беспокоится о ОЗУ.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
marat_
Шеф-повар
Опытный

ru
Offline Offline

« Ответ #21 : 08-04-2008 08:23 » 

даа, хитрость города берёт!
сначала, всё таки, анализ размеров и расширений будет совсем не лишним... а потом уже среди одинаковых размеров считать хеши
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #22 : 08-04-2008 08:26 » 

Если у тебя гарантированно за время проверки никто не добавит без твоего ведома новый файл или каталог, то можешь хранить не имена файлов и каталогов, а порядковые номера в алфавитном порядке, например. Места сэкономишь уйму Улыбаюсь
Записан
marat_
Шеф-повар
Опытный

ru
Offline Offline

« Ответ #23 : 08-04-2008 08:30 » 

да, мне такая мысль тоже в голову приходила Улыбаюсь
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #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
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #25 : 08-04-2008 08:37 » 

LogRus, можно так же использовать SQLite БД очень шустрая
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #26 : 08-04-2008 08:44 » 

McZim, с чем работал про то и говорю Улыбаюсь
Записан

Странно всё это....
marat_
Шеф-повар
Опытный

ru
Offline Offline

« Ответ #27 : 08-04-2008 08:47 » 

не, бд юзать нельзя. программа должна быть самодостаточной. а вот ещё средство экономии: использоватть досовские пути к файлам. в основе решение уже сформировалось, надо переспать, а там мозг и детали придумает. всем бАльшое спасибо!!!
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #28 : 08-04-2008 09:26 » 

Пути можно выделить в отдельную таблицу, а в основную числовой идентификатор вставлять. Так и компактнее, и с деревьями не надо возиться.

Размер файла может быть больше 4ГБ.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #29 : 09-04-2008 04:08 » new

marat_, BerkeleyDB позволяет или тащить с прогой только одну dll или статически слинковать её с твой прогой(500 кило весит всеголишь).
я бы постороил, дерево путей, проставляя уникальные номера файлам, контрольную сумму или размер файла использовал бы в качестве ключа к БД, далее прошелся бы курсором по всей BerkeleyDB, файлы с одинаковой длинной или контрольной суммой будут идти подряд(это гарантирует БД), если нашел дубликаты, делал бы доп.проверки на совпадение и по номерам файлов находил бы их имена, кстати контрольную сумму можно считать не по всему файлу.

ну это как бы сделал я, но  коллективный разум наверняка найдёт более изящьные решения. Улыбаюсь
Записан

Странно всё это....
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines