好吧,不是那么大,但我需要使用一个约60,000个平均大小为30kb的文件存储在一个目录中(这是一个要求,因此不能简单地分成具有较less数量的文件的子目录)。
这些文件将被随机访问,但一旦创build,将不会写入相同的文件系统。 我目前正在使用Ext3,但发现它非常缓慢。 有什么build议么?
你应该考虑XFS。 它支持文件系统和目录级别的大量文件,即使由于B +树数据结构而导致大量条目,性能仍然相对一致。
他们的维基页面上有大量关于devise细节的论文和出版物。 我build议您尝试一下,并针对当前的解决scheme进行基准testing。
Linux上有十亿个文件
本文的作者深入研究了大文件数量的文件系统的一些性能问题,并对各种文件系统ext3,ext4和XFS的性能做了一些不错的比较。 这是幻灯片放映。 http://events.linuxfoundation.org/slides/2010/linuxcon2010_wheeler.pdf
ext3目录中的许多文件已经在姊妹站点stackoverflow.com上进行了详细讨论
在我看来,ext3上的一个目录中的60 000个文件是远远不够理想的,但根据你的其他要求,它可能是足够好的。
好。 我使用ReiserFS,XFS,JFS,Ext3(dir_hash启用)和Ext4dev(2.6.26内核)做了一些初步testing。 我的第一印象是,所有的速度都很快(在我强壮的工作站上) – 事实certificate,远程生产机器的处理器相当慢。
即使在最初的testing中,我也经历过ReiserFS的一些奇怪的事情,所以裁定出来。 看来JFS的CPU需求比其他所有的要less33%,所以在远程服务器上testing一下。 如果performance不错,我会用它。
我正在编写一个应用程序,也存储了很多很多的文件,尽pipe我的文件比较大,而且我有1000万个文件可以分割成多个目录。
ext3很慢主要是因为默认的“链表”实现。 所以如果你在一个目录中有很多文件,就意味着打开或者创build另一个文件会变得越来越慢。 有一种叫做htree的索引,可以用于ext3,据说可以大大改善。 但是,它只能在创build文件系统上使用。 看到这里: http : //lonesysadmin.net/2007/08/17/use-dir_index-for-your-new-ext3-filesystems/
既然你将不得不重build文件系统,并且由于ext3的限制,我build议你使用ext4(或者XFS)。 我认为ext4更快一些,文件更小,重build速度更快。 就我所知,Htree索引是ext4上的默认值。 我真的没有任何JFS或Reiser的经验,但我曾经听到过人们的build议。
实际上,我可能会testing几个文件系统。 为什么不试试ext4,xfs和jfs,看哪一个能提供最好的整体性能?
开发人员告诉我,可以在应用程序代码中加快速度,不是做“stat + open”调用,而是“open + fstat”。 第一个比第二个慢得多。 不知道你是否有任何控制或影响。
看到我的post在这里stackoverflow。 在Linux中存储和访问多达1000万个文件有一些非常有用的答案和链接。
使用tune2fs来启用dir_index可能会有帮助。 要查看是否启用:
sudo tune2fs -l /dev/sda1 | grep dir_index
如果没有启用:
sudo umount /dev/sda1 sudo tune2fs -O dir_index /dev/sad1 sudo e2fsck -D /dev/sda1 sudo mount /dev/sda1
但我有一种感觉,你可能会走错path…为什么不产生一个扁平的指数,并使用一些代码随机select的基础上。 然后可以使用子目录来获得更优化的树结构。
您可以存储文件inode而不是文件名:访问inode数字应该快得多,以parsing文件名
ext3及以下版本支持每个目录最多32768个文件。 ext4最多支持65536个文件的实际数量,但是可以让你有更多的(它不会将它们存储在目录中,这对大多数用户来说并不重要)。
另外,目录存储在ext *文件系统上的方式本质上是一个大列表。 在更现代的文件系统(Reiser,XFS,JFS)中,它们被存储为B树,对于大型集合来说效率更高。
你不想在一个目录中塞满许多文件,你想要某种结构。 即使这样的文件的第一个字符的子目录可以提高您的访问时间。 我喜欢使用的另一个愚蠢的技巧是强制系统更新它的caching与元信息是定期运行updatedb。 在一个窗口中运行slabtop,在另一个窗口运行updatedb,你会看到很多内存将被分配给caching。 这样快很多
您没有在这些文件中指定数据的种类。 但从它的声音,你应该使用某种数据库与索引快速search。
文件系统可能不是这种需求的理想存储。 某种数据库存储比较好。 如果你不能帮助它,然后尝试拆分几个目录中的文件,并使用unionfs将这些目录挂载(绑定)在你想要所有文件出现的单个目录中。 我没有使用这种技术加速,但值得一试。