为什么删除文件以便更快删除它们很重要?

时间:2013-07-30 19:13:14

标签: algorithm filesystems b-tree delete-file

前段时间我学到了rsync deletes files much faster that many other tools

几天前,我遇到了this wonderful answer on Serverfault,这解释了为什么rsync擅长删除文件。

该答案的引言:

  

我今天重访了这个,因为大多数文件系统都存储了他们的目录   btree格式的结构,删除文件的顺序是   也很重要。你需要避免重新平衡btree   执行取消链接。因此我在删除之前添加了一个排序。

您能否解释一下如何按顺序删除文件可以防止或减少btree重新计算的数量?


我希望答案显示如何删除以提高删除速度,并详细说明btree级别的内容。编写rsync和其他程序的人(参见问题中的链接)使用这些知识来创建更好的程序。我认为让其他程序员有这种理解能够更好地编写软件非常重要。

5 个答案:

答案 0 :(得分:10)

这不重要,也不是b-tree问题。这只是一个巧合

首先,这非常依赖于实现,并且非常具体。这就是为什么我说它并不重要(一般用途)。否则,请输入ext3标签或编辑摘要行。

其次,ext3 使用b-tree作为目录条目索引。它使用Htree。 Htree类似于b-tree但不同且not require balancing。在fs/ext3/dir.c中搜索“htree”。

由于基于htree的索引,a)ext3与ext2相比具有更快的查找速度,但b)readdir()以哈希值顺序返回条目。哈希值顺序相对于文件创建时间或数据的物理布局是随机的。众所周知,随机访问比旋转媒体上的顺序访问要慢得多。

A paper on ext3 published for OLS 2005 by Mingming Cao, et al.建议(强调我的):

  

按照inode编号对readdir()返回的目录条目进行排序。

现在,进入rsync。 Rsync按文件名对文件进行排序。请参阅flist.c::fsort()flist.c::file_compare()flist.c::f_name_cmp()

我没有测试以下假设,因为我没有@MIfe got 43 seconds的数据集。但我认为按名称排序比readdir()返回的随机顺序更接近最佳顺序。这就是为什么你在ext3上使用rsync看到更快的结果。如果使用随机文件名生成1000000个文件然后用rsync删除它会怎么样?你看到了同样的结果吗?

答案 1 :(得分:9)

让我们假设您发布的答案是正确的,并且给定的文件系统确实将事物存储在平衡树中。平衡树是一项非常昂贵的操作。保持树“部分”平衡是非常简单的,因为当你允许树稍微失衡时,你只需要担心在插入/删除点周围移动东西。但是,当谈到完全平衡的树时,当你删除一个给定的节点时,你可能会发现突然,这个节点的子节点可能属于树的完整对面,或者对面的子节点已成为根节点节点,所有的孩子都需要在树上向上旋转。这需要您进行一系列旋转,或将所有项目放入数组并重新创建树。

            5
    3               7
2       4       6       8

现在删除7,简单吧?

            5
    3               8
2       4       6       

现在删除6,仍然很容易,是的......?

            5
    3               8
2       4       

现在删除8,哦哦

            5
    3               
2       4

让这棵树成为适当的平衡形式,如:

        4
    3       5
2

非常昂贵,至少与我们所做的其他清除相比,并且随着树木深度的增加而呈指数级变差。在删除8之前,我们可以通过删除2和4来更快地(以指数方式)更快地进行此操作。特别是如果我们的树深度超过3级。

没有排序,平均移除O(K * log_I(N)^ 2)。 N表示元素总数,K表示要删除的数量,I表示允许给定节点的子节点数,log_I(N)表示深度,对于每个深度级别,我们以二次方式增加操作数。

使用某些排序帮助删除平均为O(K * log_I(N)),但有时排序无法帮助您,并且您无法删除需要重新平衡的内容。尽管如此,最小化这是最佳的。

编辑:

另一种可能的树排序方案:

            8
    6               7   
1       2       3       4

在这种情况下实现最佳移除会更容易,因为我们可以利用我们对事物分类方式的了解。在任何一种情况下都是可能的,事实上两者都是相同的,在这一点下,逻辑只是更容易理解,因为对于给定的场景,排序更加人性化。在任何一种情况下,有序被定义为“首先移除最远的叶子”,在这种情况下恰好是最远的叶子也是最小的数字,这是我们可以利用它甚至一点点的事实更优化,但这个事实不一定适用于所提供的文件系统示例(尽管它可能是)。

答案 2 :(得分:2)

如果您按顺序删除文件,我不相信B树重新平衡的数量会发生显着变化。但是我确实相信,如果你这样做,对外部存储的不同寻求的数量会明显减少。在任何时候,B树中唯一需要访问的节点将是树的最右边界,而随着随机顺序,B树中的每个叶块以相同的概率访问每个文件。

答案 3 :(得分:1)

B-Tree的重新平衡比B-Tree +实现更便宜,这就是大多数文件系统和数据库索引实现使用它们的原因。

删除时有很多方法,取决于方法,它在时间和重新平衡树的需要方面可以更有效。您还必须考虑节点的大小,因为节点可以存储的密钥数量将影响重新平衡树的需要。一个大的节点大小只会重新排序节点内的键,但是一个小节点可能会使树重新平衡很多次。

理解这一点的一个很好的资源是着名的CLR(托马斯科尔曼)一书“算法导论”。

答案 4 :(得分:0)

在托管大型目录的存储系统上,缓冲区缓存将处于压力之下,缓冲区可能会被回收。因此,如果您按时间间隔删除,那么在删除之间将btree重新放入缓冲区缓存中的磁盘读取数可能很高。

如果对要删除的文件进行排序,实际上是在延迟删除并对它们进行聚合。这可能会导致每个btree页面中有更多删除的副作用。如果有两个实验之间有缓冲区缓存命中的统计数据,它可能会判断这个次数是否错误。

但是,如果在删除过程中缓冲区缓存没有压力,那么btree块可以保留在核心中,然后我的假设不是有效的。