在文件系统中存储大量文件

11
我有数百万个基于 GUID(http://en.wikipedia.org/wiki/Globally_Unique_Identifier)生成的音频文件。如何将这些文件存储到文件系统中,以便可以在同一文件系统中高效添加更多文件,并且可以高效地搜索特定文件。同时,它还应该具有可扩展性。
文件根据GUID命名(唯一文件名)。
例如:
[1] 63f4c070-0ab2-102d-adcb-0015f22e2e5c
[2] ba7cd610-f268-102c-b5ac-0013d4a7a2d6
[3] d03cf036-0ab2-102d-adcb-0015f22e2e5c
[4] d3655a36-0ab3-102d-adcb-0015f22e2e5c
请提供您的意见。
注:我已经阅读了 Storing a large number of images。我需要特定的数据结构/算法/逻辑,使其在未来也可扩展。
编辑1:文件数量约为100-200万,文件系统为ext3(CentOS)。
谢谢。

纳文

4个回答

19

这很简单 - 基于GUID值的部分构建一个文件夹树。

例如,创建256个文件夹,每个文件夹以第一个字节命名,并且只在那里存储以此字节开头的GUID的文件。如果仍然有太多文件在一个文件夹中 - 对于GUID的每个文件夹的第二个字节重复相同的过程。如有需要,可添加更多级别。搜索文件将非常快速。

通过选择每个级别使用的字节数,可以有效地选择您场景所需的树结构。


如果性能至关重要,最好对每个目录中不同数量的文件进行基准测试。 - Mark Bessey
如果您有一个两级的256进制目录结构(例如文件1存储在63/63f4/63f4c070-...中),那么对于200万个文件,每个叶子目录大约会有30个文件 - 这应该表现得相当不错,并且可以适度扩展。 - caf
@Sharptooth:您能否举个例子来解释一下,这样我就能更清楚地理解了。 - Naveen
1
@Naveen:假设您将使用两个级别,每个级别一个字节。对于任何GUID,您都会在顶层创建一个文件夹,并在第一个文件夹中创建另一个文件夹。因此,对于7A09BF85-9E98-44ea-9AB5-A13953E88C3D,您将创建7A和7A/09文件夹,并将文件放入7A/09文件夹中。如果您搜索7A09BF85-9E98-44ea-9AB5-A13953E88C3D,则查看是否存在7A/09/7A09BF85-9E98-44ea-9AB5-A13953E88C3D文件。 - sharptooth

1
构建n级深度的文件夹层次结构来存储您的文件。嵌套文件夹的名称将是相应文件名的前n个字节。例如:要在四级深度的文件夹层次结构中存储文件“63f4c070-0ab2-102d-adcb-0015f22e2e5c”,请构建6/3/f/4并将该文件放置在此层次结构中。层次结构的深度取决于您系统中可以拥有的最大文件数量。对于我项目中的几百万个文件,4级深度的层次结构效果很好。
我在拥有近100万个文件的项目中也做了同样的事情。我的要求也是通过遍历这个巨大的列表来处理文件。我构建了一个4级深度的文件夹层次结构,并且处理时间从近10分钟缩短到了几秒钟。
这个优化的补充是,如果你想处理这些深层文件夹中存在的所有文件,那么可以预先计算所有可能的四级深度文件夹层次结构名称,而不是调用一个函数来获取前4个级别的列表。假设guid可以有16个可能的字符,那么我们将在前四个级别中有16个文件夹,我们只需预先计算16 * 16 * 16 * 16个文件夹层次结构,这只需要几毫秒的时间。如果这些大量的文件存储在共享位置,并且调用一个函数来获取目录中的列表需要近一秒钟的时间,这样可以节省大量时间。

1

我会尽量保持每个目录中文件数量的可管理性。最简单的方法是将子目录命名为GUID的前2-3个字符。


0

如果在 ext3 卷上使用 dir_index,将音频文件排序到单独的子目录中可能会变慢。(dir_index:“使用哈希B树加速大型目录中的查找。”)

此命令将设置 dir_index 功能:tune2fs -O dir_index /dev/sda1


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接