c - Unix下最快的删除目录

标签 c performance unix

我目前正在处理对 I/O 非常敏感的代码,在性能方面,我正在寻找从 C 代码中删除 Unix 目录的最快方法。我想写一些适用于所有常见平台(Android、MacOS X、Linux)的东西,但我愿意为不同风格的 Unix 编写不同的实现(我怀疑 BSD/MacOS X 和 Linux/Android 有不同的技巧)。

以下是我想到的一些事情:

  • 在所有平台上,我可以使用 opendirreaddir_r 等遍历目录结构,使用 dirent->_d_type 来区分目录和文件——这在 Linux 下似乎是标准化的,但在 MacOS X 下却不是;

  • 在Linux/Android下,如果我选择这个选项,我还可以使用dirfdunlinkat来快速删除每个文件;

  • 在所有平台上,我可以使用 ftw 遍历目录结构,使用 flag 来区分目录和文件;

  • 在所有平台上,我可以使用 fts_openfts_read 等遍历目录结构,使用 FTSENT->fts_info 来区分目录和文件;

  • 我没有检查过,但我的印象是 BSD/MacOS X 的 copyfile 函数可以用来删除目录。

这些技术中的一种是否严格来说优于其他技术?我是否遗漏了一些明显的东西?

请注意,我最感兴趣的是最小化 I/O,更一般地说,是系统调用 - 我对 CPU 成本并不太贪心。

谢谢

最佳答案

可能最快删除目录的方法是不删除它:-)

或者,更准确地说,延迟它。如果您的目的是简单地摆脱(例如)/home/pax/porn,只需将它mv 到同一文件系统上的其他地方(/home/no_user/junk/pax/porn) 并启动后台进程以在低优先级进程中摆脱它。

我所说的低优先级并不一定是指 CPU 运行,更多的是该进程将根据您的需要尽可能减少资源使用。

例如,如果您需要将此 I/O 效果分散到很长一段时间内,您可以让进程删除文件或目录,并在两者之间有延迟。虽然 I/O 可能类似于您一次删除所有文件,但在短时间内测得的 I/O 会更少。

这种方法的优点是,根据任何进程寻找您“删除”的目录,它几乎立即就消失了。

恢复磁盘空间当然需要一段时间,因为这是以延迟的方式发生的,但这是否重要取决于您的相对优先级。

关于c - Unix下最快的删除目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10600864/

相关文章:

c - stdin/stderr 是否保证在进程终止后关闭?

检查两个指针​​是否在同一页上

android - JSON文件VS SQLite android

mysql - Sequel Pro(MySQL)执行联接查询(6000 * 5,000,000)

python - 使用 for 循环时如何减少 JAX 编译时间?

c - create系统调用为什么叫creat?

c - 我想用一个字符串的前缀和另一个字符串的后缀创建一个新字符串

c# - 在 C# 中将字符串打印到字节指针

python - ipython,从 bash 到变量

shell - 重命名 UNIX 目录中的文件 - shell 脚本