在我们的网站中,用户可以拥有许多私人文件。我们正在考虑什么是最好的发行版,以避免破坏服务器的性能。这些文件通过Apache提供,应该在每次用户需要管理它们时列出。
我们现在的第一个方法是:
var first_level = (int) $user_id/100;
var files_folder = /uf/$first_level/$user_id
这为我们提供了第一级100个文件夹和许多二级文件夹。 由于并非所有用户都拥有文件,现在我们的用户数约为80,000,这意味着每个第二级文件夹大约有800个文件夹。
您如何看待这种方法?
答案 0 :(得分:1)
如果您的用户ID值分布相当均匀并且数字会继续增加,那么您应该更多地平衡树。什么是最好的部分取决于你认为你最终会在数字方面的结果。搜索大目录比小目录慢。虽然800个文件并不糟糕,但它也不是很好。如果你想坚持2层并且你有 N 用户(作为你的目标人口),那么你应该瞄准第一层中的 sqrt(N)文件夹,每个第二层目录中的 sqrt(N)个文件夹。对于 N = 80,000,这意味着每个级别大约有300个文件夹。如果要考虑3层排列,请将平方根替换为立方根。您可能还会发现使用模运算可以使分布更平滑。也就是说,第一级可能更好地计算为:
var first_level = (int) ($user_id % 300);
假设您的未识别语言使用%作为其模运算符。
CPAN使用基于3层的系统:第一层是用户登录ID的第一个字母;第二层是前两个字母,第三层是完整的登录ID。
我在某处读到某个网站(大学,IIRC)发现名字的第一个和最后一个字母给了一个好的系统。
答案 1 :(得分:1)
如果您不关心可读性,那么流行的可扩展文件夹命名方案就像squid使用的那样:<4-bit>/<8-bit>/<remaining-116-bit-of-md5-of-whatever-lookup-key>
或<whatever-unique-key-you-have>
,因此对于user-id 1,文件夹路径可以是/ c4 / CA42 / 1。
在这种情况下,第一级最多16个目录,第二级最多256个目录。
这种方法的最大优点是文件夹的分布在统计上是统一的,无论您的用户ID /用户名中是否有漏洞或群集(较小的用户ID往往因磨损而未使用)。
答案 2 :(得分:1)
您没有说明用于存储文件的文件系统。您应该很容易创建一个随机目录树,其中包含您期望实际负载的特征。然后你可以运行实验,它会告诉你正在考虑的各种策略的表现。
我无法轻易找到有关哪些文件系统为大型目录使用高效数据结构(如B树)的信息。我确实找到了MacOS HFS的说法。我会研究XFS或其他高性能的日志文件系统。