[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Очистка большого количества файлов
Nikitian
Есть папка, где есть куча подпапок, в которых лежат файлы. О файлах имеется запись в базе. Но, не обо всех файлах в базе есть запись.
Файлов много и меньше их становиться точно не будет. Порядок количества файлов: 10-100к, в последствии больше.
Надо найти файлы, о которых нет записей в бд и удалить их. Все просматривать не вариант. Единственное, что надумал - это делать метки о проверенных файлах, но как их помечать, не могу придумать (ведь сегодня файл в базе, а через некоторое время может пропасть). Ещё раз: сверять каждый файл с бд - не очень хороший вариант.

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



Спустя 13 минут, 7 секунд (4.08.2009 - 17:28) waldicom написал(а):
В упрощенном виде:

$all_files_db = select filename from table;
$all_files_disk = exec('ls -la');

в массивы и сравнивать..

Или я не так понял?

Спустя 17 минут, 11 секунд (4.08.2009 - 17:46) Nikitian написал(а):
Ну как бэ от 10к файлов и записей в бд соответственно. Тут только как-то кусочками сравнивать.

Спустя 9 минут, 20 секунд (4.08.2009 - 17:55) waldicom написал(а):
На сервера мало памяти?

Спустя 9 минут, 12 секунд (4.08.2009 - 18:04) Nikitian написал(а):
На сервере память не только под эту операцию нужна.
Решить в лоб не проблема - вопрос как сделать это ненапряжно для железа (апгрейд железа не вариант)

Спустя 10 минут, 27 секунд (4.08.2009 - 18:15) waldicom написал(а):
Ну тогда было бы неплохо знать, как часто надо проводить проверку.

Спустя 6 минут, 38 секунд (4.08.2009 - 18:21) kirik написал(а):
Nikitian
Названия файлов в базе имеют какой-нибудь Id или дату добавления?

Спустя 1 час, 1 минута, 4 секунды (4.08.2009 - 19:22) Sylex написал(а):
Nikitian
не понимаю в чем проблема.. и почему не решить задачу в лоб...

Спустя 44 минуты, 41 секунда (4.08.2009 - 20:07) FatCat написал(а):
У меня реализовано похожее, ненапряжно для железа работает, сейчас порядка 5К файлов, но в тестовом режиме гонял и для 50К.

Спасибо twin за скрипт поиска файлов с нужным расширением, взял его за основу: http://phpforum.ru/index.php?showtopic=0&v...indpost&p=69618
Чтобы не грузить железо сверх меры, в цикле сделал usleep(10) и запрос к БД на предмет, есть ли файл-то.
Само собой, что
PHP
@set_time_limit(0);
@
ignore_user_abort(TRUE);
И молотит себе потихонечку, не сильно напрягая железо. 5К обсчитывает секунд за 20; дык хоть пол-часа пусть молотит, не жалко.

Спустя 8 минут, 9 секунд (4.08.2009 - 20:15) kirik написал(а):
А для поиска файлов по расширению есть же специальная функция glob().. Иль не подходит?

Спустя 15 минут, 13 секунд (4.08.2009 - 20:30) sergeiss написал(а):
Я бы попробовал так сделать.

1. Загоняю все существующие файлы в специальную таблицу в БД.
2. Используемые файлы уже сидят в другой таблице в БД.
3. Использую JOIN для сравнения списков таблиц, и выбираю только те записи, которые есть в таблице "существующие", и которых нет в таблице "используемые".
4. Далее просто тупо в цикле удаляю те ненужные файлы, которые нашел. Тут можно использовать и usleep для "подтормаживания", о чем говорит FatCat.
5. Удаляем таблицу существующих файлов. Она не нужна вплоть до следующей чистки.

А при выборке - проблема самой БД, как использовать ресурсы сервера. Я думаю, что даже для 100К файлов загнать их имена в БД и сравнить с другой таблицей будет не такой уж трудоёмкой задачей. Тем более, что вряд ли она будет часто запускаться.

Спустя 8 минут, 53 секунды (4.08.2009 - 20:39) kirik написал(а):
Если место не жмет, то можно и не удалять smile.gif

Спустя 13 минут, 36 секунд (4.08.2009 - 20:53) Sylex написал(а):
Цитата (kirik @ 4.08.2009 - 23:15)
А для поиска файлов по расширению есть же специальная функция glob().. Иль не подходит?

замечательная функция, только тут рекурсию надо добавить smile.gif

Спустя 53 минуты, 15 секунд (4.08.2009 - 21:46) Nikitian написал(а):
sergeiss
Пожалуй ваша идея с временной таблицей мне нравится больше всего. Так и сделаю. Это же просто какой-нибудь left join с фильтром по null. Гениально!

А молотить постоянно - как-то мне религия не позволяет на пхп писать демона )))

Спустя 1 час, 41 секунда (4.08.2009 - 22:47) sergeiss написал(а):
Цитата (Nikitian @ 4.08.2009 - 22:46)
Гениально!

(скромно так, тихим шепотом) Ну да, я такой laugh.gif

Спустя 19 часов, 45 минут, 19 секунд (5.08.2009 - 18:32) Sharm написал(а):
я бы делал так:
прошелся бы по базе и сделал копии всех файлов о которых есть данные в отдельную директорию (с сохранением структуры директорий разумеется)

потом бы просто вынес старую директорию.


Спустя 5 минут, 47 секунд (5.08.2009 - 18:38) Nikitian написал(а):
Цитата (Sharm @ 5.08.2009 - 15:32)
я бы делал так:
прошелся бы по базе и сделал копии всех файлов о которых есть данные в отдельную директорию (с сохранением структуры директорий разумеется)

потом бы просто вынес старую директорию.

Ну неее. Вы никогда не пробовали копировать несколько тысяч файлов? Скажем так, система при этом не самая шустрая получается. Да и двойной запас по дисковому пространству - это не самый бюджетный вариант.
Ваш вариант аналог того, что предложил sergeiss, только его предложение сводится к построению слепка информации о данных, а не самих данных. Да и проводить операции сравнения средствами бд довольно просто и быстро.

Спустя 4 минуты, 23 секунды (5.08.2009 - 18:42) kirik написал(а):
Цитата (Sharm @ 5.08.2009 - 10:32)
прошелся бы по базе и сделал копии всех файлов о которых есть данные в отдельную директорию (с сохранением структуры директорий разумеется)
потом бы просто вынес старую директорию.

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

Спустя 3 часа, 40 минут, 6 секунд (5.08.2009 - 22:22) PandoraBox2007 написал(а):
переименовать директорию и сделать папку

а потом безопасно переименовывать

Спустя 50 минут, 1 секунда (5.08.2009 - 23:12) Nikitian написал(а):
Т.е. на время синхронизации старые файлы будут недоступны? Не айс

Спустя 17 минут, 18 секунд (5.08.2009 - 23:30) sergeiss написал(а):
Переписывать 100К+ файлов? Если каждый из них имеет размер хотя бы 1К, то получаем уже 100МБ объема. Который надо, практически впустую, гонять туда-сюда.
Мало того, что это занятие лишнего места на сервере, так это еще и много времени потребует, и ресурсы сервера будут заняты не по делу совершенно.

Мое предложение о записи имен файлов в БД и то потребует как немало места на диске, так и времени. А уж перезапись самих файлов... "Нет, сынок. Это фантастика!" smile.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.