我有数百万音频文件,基于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:我已经完成了< Storing a large number of images>。我需要特定的数据结构/算法/逻辑,以便将来也可以扩展。
EDIT1:文件数量约为1-2百万,文件系统为ext3(CentOS)。
谢谢,
纳温
答案 0 :(得分:15)
这非常简单 - 根据GUID值部分构建文件夹树。
例如,创建256个文件夹,每个文件夹以第一个字节命名,并仅存储具有以此字节开头的GUID的文件。如果在一个文件夹中仍有太多文件 - 在每个文件夹中为GUID的第二个字节执行相同操作。如果需要,添加更多级别。搜索文件会非常快。
通过选择每个级别使用的字节数,您可以有效地为场景选择树结构。
答案 1 :(得分:1)
我会尝试将每个目录中的文件数保持为一些可管理的数字。最简单的方法是在GUID的前2-3个字符后面命名子目录。
答案 2 :(得分:0)
如果在ext3卷上使用dir_index
,则将音频文件排序到单独的子目录中可能会更慢。 (dir_index:“使用散列的b树来加速大目录中的查找。”)
此命令将设置dir_index功能:tune2fs -O dir_index /dev/sda1
答案 3 :(得分:0)
构造n级深层文件夹层次结构以存储文件。嵌套文件夹的名称将是相应文件名的前n个字节。例如:要在四层深度文件夹层次结构中存储文件“ 63f4c070-0ab2-102d-adcb-0015f22e2e5c”,请构造6/3 / f / 4并将此文件放置在此层次结构中。层次结构的深度取决于系统中可以拥有的最大文件数。对于我项目中的几百万个文件,四级深度层次结构很好。
我在拥有近100万个文件的项目中也做了同样的事情。我的要求也是通过遍历这个庞大的列表来处理文件。我构建了一个4级深度文件夹层次结构,处理时间从近10分钟减少到几秒钟。
此优化的一个附加功能是,如果您要处理这些深层文件夹层次结构中存在的所有文件,则无需调用函数来获取前4个级别的列表,只需预先计算所有可能的4个级别深层文件夹层次结构名称。假设guid可以有16个可能的字符,那么在前四个级别上每个都有16个文件夹,我们只需预先计算16 * 16 * 16 * 16文件夹层次结构,只需几毫秒。如果将这些大量文件存储在共享位置,并且调用函数以提取目录中的列表将花费近一秒钟的时间,则可以节省大量时间。