有效处理2百万个文件

我有一个基于文件的数据库,有大约2M文件存储在3级子目录。

2/2/6253 2/2/6252 ... 

文件从30字节到60 KB不等。 整个DB是只读的。 DB是大约125千兆字节。

补充:所有的文件都是由zlib(python)压缩的

我想把它全部作为一个文件系统来处理。 哪个文件系统是我最好的select?

目前我使用以下脚本:

 dd if=/dev/zero of=/my_file.iso bs=1024K count=60000 mkfs.ext4 -f /my_file.iso mount -o loop /my_file.iso /mnt/ 

你可能只是想使用XFS。

这是相当有能力,你要求什么,做这项工作。

没有理由用较less使用的文件系统使其复杂化,这可能会带来其他的折衷。

请参阅: 子目录的数量如何影响Linux上的驱动器读/写性能? 以及XFS上高的目录/文件比率的影响

如果你想要更深奥的东西,顶层的文件系统ZFS zvols可以提供一个有趣的select( 用于压缩,完整性和可移植性的目的 )。

看到这里: 透明压缩文件系统与ext4结合

如果它是只读的,为什么不使用ISO文件? 你可以使用genisoimagemkisofs

如果你想压缩整个事情,你也可以使用压缩比非常高的另一个只读文件系统squashfs

看到一些小文件,我会考虑使用SquashFS。 特别是如果你有足够强大的CPU(意味着没有奔腾III,或1GHz的ARM)。

根据存储的数据types,SquashFS在读取数据时可以大大减小其大小,从而减lessI / O。 唯一的缺点是读取的CPU使用率。 另一方面,任何现代的CPU都可以以远超过HDD甚至SSD的速度进行解压缩。

作为另一个优点 – 节省空间/带宽和/或传输后解压缩的时间。

一些基准比较它与ISO和其他类似的手段。 就像每一个基准一样,拿一粒盐和更好的,假的你自己的。 😉

编辑:根据情况(我不敢在这里猜测)没有压缩的SquashFS( mksquashfs -noD )可能会胜过ext4,因为读取的代码应该简单得多,并为只读操作进行了优化。 但是,这真的取决于你在用例中的基准。 另一个优点是SquashFS的图像比你的数据稍大一些。 使用Ext4,您必须始终创build更大的循环设备。 当然,缺点是,当你需要改变数据的时候,这是相当不舒服的。 使用ext4更容易。

我不确定这是否适合你的目的,但你有没有考虑到tar结合多个文件? 这可能会降低文件系统的压力和空间要求,并且数据库应用程序可以使用其中一个tar文件库来读取特定文件的数据。

根据您的访问模式,这甚至可能会提高性能。