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

我有数百万个音频文件 ,基于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

PL。 发表你的看法。

PS:我已经完成了。 我需要特定的数据结构/算法/逻辑,以便将来也可以扩展

EDIT1:文件数量约为1-2百万,文件系统为ext3(CentOS)。

谢谢,

纳文

这很容易 – 根据GUID值部分构建文件夹树。

例如,创建256个文件夹,每个文件夹以第一个字节命名,并且只存储具有以此字节开头的GUID的文件。 如果在一个文件夹中仍有太多文件 – 在每个文件夹中为GUID的第二个字节执行相同操作。 如果需要,添加更多级别。 搜索文件会非常快。

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

我会尝试将每个目录中的#个文件保留为一些可管理的数字。 最简单的方法是在GUID的前2-3个字符后面命名子目录。

如果在ext3卷上使用dir_index则将音频文件排序到单独的子目录中可能会更慢。 (dir_index:“使用散列b树来加速大目录中的查找。”)

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

构建n级深层文件夹层次结构以存储文件。 嵌套文件夹的名称将是相应文件名的前n个字节。 例如:要在四级深层文件夹层次结构中存储文件“63f4c070-0ab2-102d-adcb-0015f22e2e5c”,请构造6/3 / f / 4并将此文件放在此层次结构中。 层次结构的深度取决于系统中可以包含的最大文件数。 对于我项目中的几百万个文件,4级深度层次结构运行良好。

在我的项目中我也有同样的事情,有近100万个文件。 我的要求也是通过遍历这个庞大的列表来处理文件。 我构建了一个4级深层文件夹层次结构,处理时间从近10分钟减少到几秒钟。

如果要处理这些深层文件夹层次结构中存在的所有文件,则可以添加此优化,而不是调用函数来获取前4个级别的列表,只需预先计算所有可能的4级深层文件夹层次结构名。 假设guid可以有16个可能的字符,那么我们将在前四个级别分别有16个文件夹,我们可以预先计算只需几毫秒的16 * 16 * 16 * 16文件夹层次结构。 如果将这些大量文件存储在共享位置并且调用一个函数来获取目录中的列表需要将近一秒钟,这将节省大量时间。