2015-06-28 2 views
0

Я поддерживаю устаревшую систему Linux, которая поддерживает миллионы небольших файлов в большом массиве хранения. (Да, файловая система кошмар)Выполнение системы ("rm x. *") Vs unlink()?

В C++ код, который я нашел файлы удаляемого как системы («гт -f /dir/dir/file.*»)

Я подозреваю, используя Разорвать связь() будет намного быстрее, но насколько быстрее? (я не могу проверить его на производстве)

У кого-нибудь есть сравнительные данные по этому вопросу?

старый код уже хрупкий и замена удобной системы() вызывает с тривиальным зацеплением() и получением подстановки на работу, и т.д., это хороший кусок работы ...

ответ

2

фактически не устанавливать это и тестируя его (по типу машины, с правильной инфраструктурой на месте - например, сетевые файлы ведут себя отличные от файлов жесткого диска, которые снова отличаются от флеш-дисков или файлов SSD), на самом деле невозможно точно ответить. Тем не менее, мы можем обсудить «что такое накладные расходы одного над другим»:

unlink() - вызов функции в вашем собственном исполняемом файле, который затем переводит на соответствующий системный вызов в ядре. Ваш код должен будет перебирать соответствующие файлы, которые нужно удалить.

system("rm something") будет переводить fork(); exec("sh", "rm", "something");, и оболочка будет выполнять glob() на "something", расширяющейся в соответствующий список файлов, а затем выполнить rm, который довольно быстро превращается в unlink(), но есть немного накладных расходов.

В конечном счете, это действительно сводится к количеству файлов и, возможно, к какой файловой системе они хранятся. Если есть много файлов (сотни или тысячи), тогда накладные расходы на вызов system минимальны. С другой стороны, если вы делаете что-то вроде for_each(list_of_files) system("rm " + file_in_list); [это не MEANT для компиляции], накладные расходы на for_each(list_of_files) unlink(file_in_list); будут заметны для большого количества файлов.

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

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

Смежные вопросы