Файлов много и меньше их становиться точно не будет. Порядок количества файлов: 10-100к, в последствии больше.
Надо найти файлы, о которых нет записей в бд и удалить их. Все просматривать не вариант. Единственное, что надумал - это делать метки о проверенных файлах, но как их помечать, не могу придумать (ведь сегодня файл в базе, а через некоторое время может пропасть). Ещё раз: сверять каждый файл с бд - не очень хороший вариант.
Не спрашивайте почему и как файлы могут пропадать: задача не пресечь непредвиденные пропажи, а найти неприкаянные файлы.
Спустя 13 минут, 7 секунд (4.08.2009 - 17:28) waldicom написал(а):
В упрощенном виде:
$all_files_db = select filename from table;
$all_files_disk = exec('ls -la');
в массивы и сравнивать..
Или я не так понял?
$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 или дату добавления?
Названия файлов в базе имеют какой-нибудь 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) и запрос к БД на предмет, есть ли файл-то.
Само собой, что
Спасибо twin за скрипт поиска файлов с нужным расширением, взял его за основу: http://phpforum.ru/index.php?showtopic=0&v...indpost&p=69618
Чтобы не грузить железо сверх меры, в цикле сделал usleep(10) и запрос к БД на предмет, есть ли файл-то.
Само собой, что
PHP |
@set_time_limit(0); |
И молотит себе потихонечку, не сильно напрягая железо. 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К файлов загнать их имена в БД и сравнить с другой таблицей будет не такой уж трудоёмкой задачей. Тем более, что вряд ли она будет часто запускаться.
1. Загоняю все существующие файлы в специальную таблицу в БД.
2. Используемые файлы уже сидят в другой таблице в БД.
3. Использую JOIN для сравнения списков таблиц, и выбираю только те записи, которые есть в таблице "существующие", и которых нет в таблице "используемые".
4. Далее просто тупо в цикле удаляю те ненужные файлы, которые нашел. Тут можно использовать и usleep для "подтормаживания", о чем говорит FatCat.
5. Удаляем таблицу существующих файлов. Она не нужна вплоть до следующей чистки.
А при выборке - проблема самой БД, как использовать ресурсы сервера. Я думаю, что даже для 100К файлов загнать их имена в БД и сравнить с другой таблицей будет не такой уж трудоёмкой задачей. Тем более, что вряд ли она будет часто запускаться.
Спустя 8 минут, 53 секунды (4.08.2009 - 20:39) kirik написал(а):
Если место не жмет, то можно и не удалять

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

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

Спустя 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МБ объема. Который надо, практически впустую, гонять туда-сюда.
Мало того, что это занятие лишнего места на сервере, так это еще и много времени потребует, и ресурсы сервера будут заняты не по делу совершенно.
Мое предложение о записи имен файлов в БД и то потребует как немало места на диске, так и времени. А уж перезапись самих файлов... "Нет, сынок. Это фантастика!"
Мало того, что это занятие лишнего места на сервере, так это еще и много времени потребует, и ресурсы сервера будут заняты не по делу совершенно.
Мое предложение о записи имен файлов в БД и то потребует как немало места на диске, так и времени. А уж перезапись самих файлов... "Нет, сынок. Это фантастика!"
