如何将大量小文件合并为一个文件

Posted

技术标签:

【中文标题】如何将大量小文件合并为一个文件【英文标题】:How to merge a huge number of small files into one file 【发布时间】:2015-12-06 09:57:59 【问题描述】:

我有大约 150 万个小文件,总大小约为 80 GB。

我想将这些文件合并到一个文件中以便快速复制。我尝试将它们归档到一个 zip 文件中,并使用以下代码读取文件:

ZipFile zip = ZipFile.Read(Settings.Default.DataPath); 
ZipEntry entery = zip[MyFile];

这个想法奏效了,但是太慢了,加载一个文件大约需要 30 秒。

还有其他更快的方法来合并文件吗?

谢谢

【问题讨论】:

可能你需要 SSD :) 这是能量对话的原理。在某些时候,你不能再优化东西了。您也许能够使用更好的硬件,或者将您的小文件数据库重构为更易于管理的东西(您是否考虑过将文件分发到多个位置并使用索引访问来检索它们?) 你想要什么,合并文件或制作多个文件的存档?什么类型的文件?你想复制然后访问? 使用 SQLite 数据库,包含 150 万个文件的 zip 文件的索引速度会很慢,因为存档中的文件表将按顺序读取。而是使用文件名上的索引创建数据库。它可能会略大于 80GB,但您也可以在存储到数据库之前尝试压缩每个单独的文件。 @LasseV.Karlsen :这是个好主意,非常感谢,我会将文件插入到 SQLite 文件中,请将此评论设置为批准它的答案 【参考方案1】:

一种方法是使用SQLite(您可以通过 Nuget 包添加它)并创建一个包含所有这些单独数据位的数据库文件。

您将创建一个包含所有文件的表并将文件名作为主键,这将自动在其上创建索引:

CREATE TABLE files
(
    filename TEXT NOT NULL PRIMARY KEY,
    content BLOB
)

然后将所有文件插入其中,每个文件一行。

要检索它,您可以像这样执行 SQL:

SELECT content FROM files WHERE filename = ?

我会将所有这些封装到一个新类中,以便您将维护和使用此文件的功能与应用程序的其余部分分开。

【讨论】:

以上是关于如何将大量小文件合并为一个文件的主要内容,如果未能解决你的问题,请参考以下文章

对 Hive 数仓表进行高效小文件合并

对 Hive 数仓表进行高效小文件合并

对 Hive 数仓表进行高效小文件合并

Hive任务优化—— 小文件合并相关参数

如何将多个csv按行合并?(不是首尾相接的按列合并)

如何使用 vertx 拆分和合并文件 [关闭]