很多小文件还是几个大文件?

Posted

技术标签:

【中文标题】很多小文件还是几个大文件?【英文标题】:Lots of small files or a couple huge ones? 【发布时间】:2009-06-26 21:25:34 【问题描述】:

就性能和效率而言,使用大量小文件(我的意思是几百万个)还是几个(十个左右)大(几千兆字节)文件更好?假设我正在构建一个数据库(不完全正确,但重要的是它会被大量访问)。

我主要关心读取性能。我的文件系统目前是 Linux 上的 ext3(如果重要的话,是 Ubuntu 服务器版),尽管我处于仍然可以切换的位置,所以不同文件系统之间的比较会很棒。由于技术原因,我不能为此使用实际的 DBMS(因此提出了问题),所以“只使用 mysql”不是一个好的答案。

提前致谢,如果我需要更具体的,请告诉我。


编辑:我将存储大量相对较小的数据,这就是为什么使用大量小文件对我来说更容易的原因。因此,如果我使用一些大文件,我一次只能从中检索几个 KB。我也会使用索引,所以这不是一个真正的问题。此外,一些数据指向其他数据片段(在很多小文件的情况下它会指向文件,在大文件的情况下会指向数据在文件中的位置)。

【问题讨论】:

信息越模糊,你得到的就越多,“这取决于” 那么我应该添加哪些其他信息?我想不出还有什么对这个问题有益的东西。 此数据的访问配置文件有很大的不同。您要读取大量数据吗?某些数据是否相关且最有可能一起访问?在某些时候,最好使用数据库而不是大量小文件,除非您正在做一些简单的事情,比如通过 http 为它们提供服务,而且它需要非常快。 你考虑过固态硬盘吗? @Lucas:不,我没有。那会改变什么? 【参考方案1】:

这里有很多假设,但就所有意图和目的而言,搜索一个大文件会比搜索一堆小文件快得多

假设您正在查找包含在文本文件中的文本字符串。搜索 1TB 文件 将比打开 1,000,000 MB 文件 并搜索这些文件快得多

每个文件打开操作都需要时间。大文件只需打开一次。

而且,考虑到磁盘性能,单个文件连续存储的可能性要远大于大量文件。

...同样,这些只是概括,而无需更多地了解您的具体应用。

【讨论】:

是的,除非您可以选择要搜索的小文件。不知何故。【参考方案2】:

这取决于。真的。不同的文件系统以不同的方式进行优化,但总的来说,小文件被有效地打包。拥有大文件的好处是您不必打开和关闭很多东西。打开和关闭是需要时间的操作。如果你有一个大文件,你通常只打开和关闭一次,然后使用查找操作

如果您选择大量文件解决方案,我建议您使用类似的结构

b/a/bar
b/a/baz
f/o/foo

因为您对目录中的文件数量有限制。

【讨论】:

【参考方案3】:

这里 TMO 的主要问题是关于索引。如果您要在没有良好索引的大文件中搜索信息,则必须扫描整个文件以查找可能很长的正确信息。如果你认为你可以建立强大的索引机制,那么你应该使用大文件。

我更愿意将此任务委托给 ext3,它应该很擅长。

编辑:

根据wikipedia article on ext3 需要考虑的一点是,碎片确实会随着时间的推移而发生。因此,如果您有大量占用文件系统很大比例的小文件,那么随着时间的推移,您将失去性能。

该文章还验证了关于每个目录限制 32k 文件的声明(假设 wikipedia 文章可以验证任何内容)

【讨论】:

如果我处理大文件,我会有一个索引(可能在内存中)。每次需要 2KB 数据时,我都不会搜索整个 8GB 文件。【参考方案4】:

我相信 Ext3 每个目录有大约 32000 个文件/子目录的限制。如果您要处理数百万个文件,则需要将它们分布在许多目录中。我不知道这会对性能产生什么影响。

我更喜欢几个大文件。事实上,为什么有几个,除非它们是某种逻辑上独立的单元?如果你还只是为了分裂而分裂,我说​​不要那样做。 Ext3 可以很好地处理非常大的文件。

【讨论】:

另外,是的,我会拆分大文件,因为它们包含完全不同类型的数据。但是所有相同类型的数据都在同一个文件中。【参考方案5】:

我使用的系统在 Linux 下的 XFS 文件系统上存储多达约 500 万个文件,并且没有任何性能问题。我们只使用文件来存储数据,我们从不完全扫描它们,我们有一个用于搜索的数据库,并且表中的一个字段包含一个我们用来检索的 guid。我们使用上面的两级目录,文件名是 guid,但如果文件数量更大,可以使用更多。我们选择这种方法是为了避免在数据库中存储一些额外的 TB 数据,这些数据只需要存储/返回并且从不搜索,它对我们来说效果很好。我们的文件从 1k 到大约 500k 不等。

我们还在 ext3 上运行了系统,它运行良好,但我不确定我们是否曾经将它推过大约一百万个文件。由于每个目录的最大文件数限制,我们可能需要转到 3 目录系统。

【讨论】:

以上是关于很多小文件还是几个大文件?的主要内容,如果未能解决你的问题,请参考以下文章

将几个大文件映射到内存中

外部表性能的小文件与大文件

MVP+Dagger2+Rxjava+Retrofit+GreenDao 开发的小应用,包含新闻图片视频3个大模块,代码封装良好

MVP+Dagger2+Rxjava+Retrofit+GreenDao 开发的小应用,包括新闻图片视频3个大模块,代码封装良好

按列绑定几个大矩阵

组合2个大文本文件