【问题标题】:Storing Large Number Of Files in File-System在文件系统中存储大量文件
【发布时间】:2009-10-16 05:42:01
【问题描述】:

我有数百万个基于 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)。

谢谢,

纳温

【问题讨论】:

    标签: c algorithm data-structures filesystems


    【解决方案1】:

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

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

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

    【讨论】:

    • 如果性能至关重要,最好对每个目录中不同数量的文件进行基准测试。
    • 如果你有一个两级、256 元的目录结构(比如文件 1 存储在63/63f4/63f4c070-...),那么对于 200 万个文件,你将在每个叶目录中获得大约 30 个 -它应该表现得相当好并且规模适中。
    • @Sharptooth:你能不能用一个例子来解释一下,这样它会给我一个更清晰的画面。
    • @Naveen:假设您将使用两个级别,每个级别一个字节。对于任何 GUID,您都可以在顶层创建一个文件夹,并在第一个文件夹中创建另一个文件夹。因此,对于 7A09BF85-9E98-44ea-9AB5-A13953E88C3D,您创建 7A 和 7A/09 文件夹并将文件放入 7A/09 文件夹。如果您搜索 7A09BF85-9E98-44ea-9AB5-A13953E88C3D,您会查看 7A/09/7A09BF85-9E98-44ea-9AB5-A13953E88C3D 文件是否存在。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      如果在 ext3 卷上使用 dir_index,则将音频文件分类到单独的子目录可能会变慢。 (dir_index: "使用散列 b 树加快大目录中的查找速度。")

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2012-07-02
          • 1970-01-01
          • 2015-09-07
          • 2023-04-04
          • 2012-06-29
          • 2015-11-30
          • 2015-11-04
          • 2011-01-05
          • 1970-01-01
          相关资源
          最近更新 更多