gpt4 book ai didi

c++ - 系统 ("rm x.*") 与 unlink() 的性能?

转载 作者:太空宇宙 更新时间:2023-11-04 09:31:13 26 4
gpt4 key购买 nike

我正在维护一个 Linux 遗留系统,该系统在一个大型存储阵列中维护着数百万个小文件。 (是的,文件系统的噩梦)

在 C++ 代码中,我发现文件被删除,如 system("rm -f/dir/dir/file.*")

我怀疑使用 unlink() 会快很多,但是快多少?(我无法真正在生产环境中测试它)

谁有这方面的一些比较数据?

旧代码已经很脆弱,用 unlink() 替换方便的 system() 调用并让 globbing 工作等,是一项很好的工作......

最佳答案

没有实际设置和测试它(在机器类型上,有正确的基础设施到位 - 例如网络文件的行为不同于硬盘文件,而硬盘文件又不同于闪存驱动器或 SSD 文件),它真的无法准确回答。但是,我们可以讨论“两者的开销是多少”:

unlink() 是您自己的可执行文件中的函数调用,然后转换为内核中的相关系统调用。您的代码将不得不遍历要删除的相关文件。

system("rm something") 将转换为 fork(); exec("sh", "rm", "something");,shell 将在 "something" 上执行 glob(),它展开到相关的文件列表,然后执行rm,这很快就变成了unlink(),但是有一点开销。

最终,它真的归结为文件的数量以及它们存储在什么文件系统中。如果有很多文件(数百或数千),那么调用 system 的开销是微乎其微的.另一方面,如果您执行类似 for_each(list_of_files) system("rm "+ file_in_list); 的操作 [这不是为了编译],for_each(list_of_files) unlink( file_in_list); 对于大量文件会很明显。

通常,删除大量文件会很快成为 I/O 绑定(bind),因此无论您使用什么方法,都将取决于“文件系统处理删除文件请求的速度”,而不是代码的速度实际上要求将其删除。

如果您可以针对几十个文件测量这两种解决方案之间的任何差异,那将是非常令人惊讶的 - 因为时间主要由实际执行文件系统操作(读取目录、删除目录列表中的文件,存储目录列表)。调整文件系统参数(如果尚未调整)更有可能给您带来一些好处(例如,减少将新目录结构写回磁盘的标准,但这也会带来一些其他缺点,例如文件系统不太可靠崩溃/断电的情况)。

关于c++ - 系统 ("rm x.*") 与 unlink() 的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31099698/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com