![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| tarasrng |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 8.7.2011 Репутация: нет Всего: нет |
здравствуйте. пишу программу, которая ищет все группы одинаковых файлов ненулевого размера в заданной директории и всех вложенных директориях. Одинаковыми нужно считать файлы, у которых одинаковое содержимое. имя файла, атрибуты, и т.д. на сравнение не влияют.
мой алгоритм такой: 1) получаем список файлов и директорий методом listFiles() 2) проверяем каждый элемент получившегося массива, если это файл - добавляем его в коллекцию, если директория - выполняем шаг 1 (рекурсия) в результате имеем коллекцию со всеми файлами данной директории и поддиректорий, и тут появляется первая проблема: программа ищет файлы в 2 раза дольше, чем проводник windows (если нажать alt+enter на папке) идем далее: 3) теперь нужно отсортировать нашу коллекцию по размеру файлов проблема №2 какой метод сортировки использовать? или может уже при добавлении ставить файл в нужное место, чтобы сразу получить сортированный массив? я использовал Collections.sort 4) теперь есть сортированный список файлов, и в группах файлов с одинаковым размером сравниваем содержимое. все вроде работает, но вот только если файлов сотни тысяч, приходится ждать долго вот класс, в котором я реализовал выше описанный алгоритм, кроме шага 4
к стати, тестировал программу на папке windows/system32, она на каком то файле зависает, вроде когда питается сделать dir.listFiles() я новичок в java, подобных проблем не решал, и не знаю, правильно я это делаю. посоветуйте, пожалуйста, что поменять в алгоритме, чтобы поиск был быстрее, или может не теми методами делаю, или вообще нужно другой алгоритм... прикрепляю файл с исходниками и программой. Присоединённый файл ( Кол-во скачиваний: 4 )
_________.rar 22,46 Kb |
|||
|
||||
| dorogoyIV |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1503 Регистрация: 26.3.2007 Репутация: 3 Всего: 46 |
я думаю так:
пробежаться по всем папкам, и записать файлы в файл читать этот файл, и сравнивать размеры (в какой нибудь коллекции отсортировать) теперь уже можно побайтово читать и сравнивать... а то у тебя все в буфер помещается... конечно, когда нибудь вылетит OutOffMemory... |
|||
|
||||
| Farmazon |
|
|||
![]() Разработчик ![]() ![]() Профиль Группа: Участник Сообщений: 265 Регистрация: 7.7.2006 Репутация: 1 Всего: 5 |
долго?... распараллель. вызов addFile ты можешь скармливать в ThreadPoolExecutor виде задания, только коллекцию выбери потокозащищённую...
Добавлено @ 19:24 Collections.sort не устраивает быстродействием?... тогда попробуй посмотреть в сторону TreeSet... Это сортированное множество... Добавлено @ 19:25 и лучше бы фильтровать файлы сразу и не добавлять их в коллекцию воще... Это сообщение отредактировал(а) Farmazon - 15.7.2011, 19:26 -------------------- Таково моё общее мнение. |
|||
|
||||
| dorogoyIV |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1503 Регистрация: 26.3.2007 Репутация: 3 Всего: 46 |
||||
|
||||
| Farmazon |
|
|||
![]() Разработчик ![]() ![]() Профиль Группа: Участник Сообщений: 265 Регистрация: 7.7.2006 Репутация: 1 Всего: 5 |
распихать по разным группам сразу можно?
-------------------- Таково моё общее мнение. |
|||
|
||||
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 17 Всего: 43 |
Точнее говоря, коллекцию не обьектов File, а их параметров. Если не ошибаюсь, когда на обьекте File вызывается метод length(), то происходит чтение с диска. Это сильно замедлит сортировку. |
|||
|
||||
| dorogoyIV |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1503 Регистрация: 26.3.2007 Репутация: 3 Всего: 46 |
я надеюсь не весь файл читается, а только его заголовок (32 или 64 бита) кстати в W так и делается. если запустите поиск, потом в папке %systemroot% найдете список файлов и директорий Это сообщение отредактировал(а) dorogoyIV - 16.7.2011, 01:37 |
|||
|
||||
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 17 Всего: 43 |
При сортировке по размеру, если постоянно вызывать этот метод, будет ощутимое замедление. |
|||
|
||||
| dorogoyIV |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1503 Регистрация: 26.3.2007 Репутация: 3 Всего: 46 |
COVD, нет.
один раз прочитать, взять имя и размер. записать в коллекцию. (записывать не файлы, а ссылки на файлы) отсортировать в коллекции по размеру. затем уже побайтово сравнивать только те файлы, у которых размер одинаков. я пока не вижу другого способа... |
|||
|
||||
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 17 Всего: 43 |
dorogoyIV, я придрался к формулировкам.
"имя и размер", <"имя", "размер"> - это не "список файлов" и не "ссылки на файлы". Потому, что есть класс File. |
|||
|
||||
| tarasrng |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 8.7.2011 Репутация: нет Всего: нет |
как это сделать(записать ссылки на файлы в коллекцию)? (напишите кучек кода, если не сложно) Добавлено через 9 минут и 5 секунд Farmazon, cори, но я в java еще не асс, и не понял, что Вы имели ввиду. Можно немного объяснить?
|
||||
|
|||||
| Farmazon |
|
|||
![]() Разработчик ![]() ![]() Профиль Группа: Участник Сообщений: 265 Регистрация: 7.7.2006 Репутация: 1 Всего: 5 |
уж не побайтно ты ли файлы сравниваешь?... хеш считаешь?...
пример тредпулекзекутора - http://www.javamex.com/tutorials/threads/T...lExecutor.shtml просто создаёшь пул и пихаешь в него задания(Runnable) -------------------- Таково моё общее мнение. |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |