我正在维护一个Linux遗留系统,该系统可以在大型存储阵列中维护数百万个小文件。 (是的,文件系统噩梦)
在C ++代码中,我发现文件被删除,如系统(" rm -f / dir / dir / file。*")
我怀疑使用unlink()会更快,但要快多少?(我无法在生产中真正测试它)
有人对此有一些比较数据吗?
旧代码已经很脆弱,用unlink()替换方便的system()调用并使globbing工作等等,是一大堆工作......
答案 0 :(得分:2)
没有实际设置并测试它(在机器类型上,使用正确的基础设施 - 例如网络文件与硬盘文件不同,后者与闪存驱动器或SSD文件不同),它&# 39;真的不可能准确回答。但是,我们可以讨论一个人在另一个人身上的开销是多少":
unlink()
是您自己的可执行文件中的函数调用,然后转换为内核中的相关系统调用。您的代码必须迭代要删除的相关文件。
system("rm something")
将转换为fork(); exec("sh", "rm", "something");
,shell将在glob()
上执行"something"
,rm
会扩展到相关的文件列表,然后执行{{1}很快就变成了unlink()
,但是有一点点开销。
归根结底,它实际上归结为文件的数量以及可能存储的文件系统。如果有大量文件(数百或数千),那么调用system
的开销微乎其微。另一方面,如果您执行类似for_each(list_of_files) system("rm " + file_in_list);
[不能编译]的内容,则for_each(list_of_files) unlink(file_in_list);
上的开销对于大量文件将是显而易见的。
通常,删除大量文件会很快限制I / O,因此无论使用何种方法,都将取决于文件系统处理删除文件的请求的速度,而不是#34;代码的速度实际上要求删除它。
如果您可以测量这两个解决方案之间的差异超过几十个文件,那将是非常令人惊讶的 - 因为实际执行文件系统操作所花费的时间占主导地位(读取目录,删除目录列表中的文件,将目录列表存回())。调整文件系统参数更有可能(如果还没有调整)给你一些好处(例如,减少将新目录结构写回磁盘的标准,但这也带来了一些其他缺点,例如不太可靠的文件系统崩溃/断电的情况)。