我需要在 USB 驱动器中存储 100k 个文件(大约 40GB)。每个文件都有一个唯一的 int id(例如 45000)。
选项一将所有文件放在一个文件夹中:
root/
root/1.pdf
root/2.pdf
root/3.pdf
...
root/567.pdf
root/568.pdf
root/569.pdf
...
root/10001.pdf
root/10002.pdf
root/10003.pdf
...
root/99998.pdf
root/99999.pdf
root/100000.pdf
选项二[1-9][0-9]*
是根据该 id创建文件夹层次结构:
root/
root/1/file.pdf
root/2/file.pdf
root/3/file.pdf
...
root/5/6/7/file.pdf
root/5/6/8/file.pdf
root/5/6/9/file.pdf
...
root/1/0/0/0/1/file.pdf
root/1/0/0/0/2/file.pdf
root/1/0/0/0/3/file.pdf
...
root/9/9/9/9/8/file.pdf
root/9/9/9/9/9/file.pdf
root/1/0/0/0/0/0/file.pdf
哪种方案的扩展性更好?我可以理解第二种方案需要大量的文件夹,但每个文件夹最多包含 10 个文件夹和 1 个文件。维护不是问题,因为一切都将由应用程序控制。
请注意,这是 Linux 上的 USB 驱动器,基于上述内容,我还想知道我应该使用 FAT32 还是 NTFS。
答案1
根据我的个人偏好,我建议在 Linux 中使用 ext3/4。
对于文件结构,我建议使用选项 3(目录深度和每个目录的文件之间的平衡)。这实际上只是选择一个树形数据结构。为了实现文件的这一功能,我会对每个文件进行 md5sum 哈希处理,并使用每个文件的前 x 个字符作为目录。字符将始终为十六进制字符,因此每个分支将有 16 个目录宽。您选择的字符数将是树结构的高度。
例如:
kbrandt@alpine:~/scrap$ md5sum y.tab.h
03b01228467fbe94f8fedd9fcbb6d470 y.tab.h
会像 那样去./0/3/b/y.tab.h
。
如何在Linux上预先创建用于文件存储的目录?向您展示如何预先创建目录。
这是一个通用的解决方案,适用于许多用例,并且应该创建相当好的文件分布。
答案2
绝对建议使用一定级别的文件夹树系统;避免每个文件夹中放置超过 10k 个文件。如果 NTFS 或 EXT 可用,请不要使用 FAT。
答案3
- 扩展 2:应使用目录。通过扫描条目列表来查找文件。
- 扩展 3:您可以将它们全部转储到根目录中。HTree 结构将使访问它们变得相当快。我推荐这个。
- FAT32:我对这个了解不多,但考虑到目录条目限制的历史,我推测它的作用很像 Ext2。
- NTFS:除非需要与 Windows 兼容,否则请避免使用 Linux。使用 B+ 树,速度应该相当快。
如果您使用目录结构,我会将 100-200 个文件放入目录中。因此,在顶层,可能是这样的:
[0-99] #Directory entries
[0-99] #File entries
下面是...
[0-99] #Directory entries
[directory prefix][0-99] #File entries -- so in /37/76, one might find 377692 .pdf
答案4
FAT 的速度会随着磁盘上文件数量的增加而变慢,而不是每个目录的速度,因此您不会发现任何差异。
读这M$ 论文关于 FAT32