3

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

以下是我脑海中闪过的几件事:

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

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

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

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

  • 我没有检查过,但我的印象是BSD/MacOS Xcopyfile功能可以用来删除一个目录。

这些技术中的一种是否比其他技术更好?我错过了一些明显的东西吗?

请注意,我主要对最小化 I/O 以及更普遍的系统调用感兴趣——我对 CPU 成本并不太贪心。

谢谢

4

1 回答 1

3

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

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

低优先级,我并不一定是指 CPU 咕噜声,更多的是进程会根据您的需要尽可能减少资源使用。

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

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

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

于 2012-05-15T12:52:03.050 回答