Эффективно сканировать дерево каталогов по дате

Какой самый эффективный способ получить список новых файлов после указанной даты в php или, возможно, с помощью системного вызова?

У меня есть полный контроль над тем, как файлы хранятся, когда я их получаю, поэтому я подумал, что лучше всего хранить их в структуре папок типа год/месяц/день/имя файла, тогда все, что мне нужно сделать, это сканировать каталоги больше, чем или равной дате, которую я хочу получить, используя scandir и приведя имя каталога к значениям int. Но я не уверен, что упускаю что-то, что сделало бы это проще/быстрее. Меня интересует наиболее эффективный способ сделать это, так как со временем будет создаваться много файлов, и я не хочу повторно сканировать старые каталоги. По сути, структура каталогов должна хорошо поддаваться эффективной ручной фильтрации, но я хотел проверить, не упустил ли я что-то.

Простой пример использования:

'2012/12/1' contains files test1.txt, test2.txt
'2012/12/2' => test3.txt, test4.txt
'2011/11/1' => test5.txt
'2011/11/2' => test6.txt

Если я ищу файлы 2011/11/2 или позже, я хочу, чтобы возвращалось все, кроме test5.txt.

Заранее спасибо за любую информацию!

редактировать: хранение и фактическая обработка файлов - это два отдельных процесса, поэтому я не могу просто обрабатывать их по мере их поступления, что, очевидно, было бы лучшим решением.


person Eric    schedule 24.12.2012    source источник
comment
Я часто использую эту технику, часто сохраняя миллионы файлов в одном дереве. Обратите внимание, что я добавляю даты 0, поэтому у меня будет 2013/01/01, чтобы все правильно сортировалось даже в виде строк.   -  person Gabe    schedule 24.12.2012
comment
Гейб, значит, ты хочешь сказать, что мой запланированный способ доступа к измененным файлам имеет смысл? Псевдокод будет заключаться в том, чтобы перечислить все годы в каталоге и учитывать только те, которые относятся к интересующей меня дате или позже; то же самое для месяца и дня. Если да, то создайте для него ответ, чтобы я мог отметить его принятым.   -  person Eric    schedule 24.12.2012


Ответы (2)


Вообще говоря, я создаю каталоги типа YYYY/MM/DD для хранения своих файлов, часто с другим уровнем для разных источников. Иногда я буду использовать YYYY-MM/DD или что-то подобное. Обратите внимание, что в декаде всего 3652 дня, поэтому вы можете иметь даже один уровень, например YYYY-MM-DD, и не получать каталоги, которые настолько велики, что с ними трудно работать. Если у вас есть файловая система, которая индексирует каталоги, вы можете легко иметь десятки тысяч файлов в каталоге, в противном случае, вероятно, вашим верхним пределом должна быть тысяча.

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

Например, допустим, я хочу обработать все файлы за последнюю неделю:

for $date = today() - 7 to today():
    $path = strftime("%Y/%m/%d", $date)
    for $filename in getFiles($path):
        processFile($path, $filename)
person Gabe    schedule 24.12.2012
comment
Спасибо, это было очень полезно и дало несколько хороших идей. В итоге я сделал что-то очень похожее на ваш псевдокод. - person Eric; 24.12.2012

Похоже, вы используете Linux или Mac в зависимости от того, как вы написали свой путь.

Команда find может вернуть список файлов, измененных (или доступных) в течение определенной даты.

// find files that were modified less than 30m ago
$filelist = system("find /path/to/files -type f -mmin -30"); 

Я думаю, что системные вызовы следует использовать с осторожностью, поскольку они снижают переносимость.

Хранение в каталогах, как вы упомянули, имеет смысл, поскольку это уменьшит пространство для поиска.

person Amir T    schedule 24.12.2012
comment
Это нормально, если у вас 1000 или 10 000 файлов, но что, если у вас миллионы файлов? - person Gabe; 24.12.2012
comment
@gabe да, /path/to/files может включать структуру каталогов с меткой времени. Это не мьютекс с выбором хранилища. - person Amir T; 24.12.2012