| 
			| 
					
						| 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 | 
								|  | « Ответ #28 : 08-04-2008 09:26 »  |  | 
 
 Пути можно выделить в отдельную таблицу, а в основную числовой идентификатор вставлять. Так и компактнее, и с деревьями не надо возиться.
 Размер файла может быть больше 4ГБ.
 |  
						| 
								|  |  
								|  |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	| 
			| 
					
						| Антон (LogRus) | 
								|  | « Ответ #29 : 09-04-2008 04:08 »  |  | 
 
 marat_, BerkeleyDB позволяет или тащить с прогой только одну dll или статически слинковать её с твой прогой(500 кило весит всеголишь). я бы постороил, дерево путей, проставляя уникальные номера файлам, контрольную сумму или размер файла использовал бы в качестве ключа к БД, далее прошелся бы курсором по всей BerkeleyDB, файлы с одинаковой длинной или контрольной суммой будут идти подряд(это гарантирует БД), если нашел дубликаты, делал бы доп.проверки на совпадение и по номерам файлов находил бы их имена, кстати контрольную сумму можно считать не по всему файлу. ну это как бы сделал я, но  коллективный разум наверняка найдёт более изящьные решения.   |  
						| 
								|  |  
								|  |  Записан | 
 
 Странно всё это.... |  |  | 
	|  |