在很短的时间内连接非常大(~TByte)的文件

Posted

技术标签:

【中文标题】在很短的时间内连接非常大(~TByte)的文件【英文标题】:concatenate extremely large(~TByte) file in very short time 【发布时间】:2012-02-06 07:56:42 【问题描述】:

首先,我想解释一下为什么我需要这个。 我需要为虚拟机创建一些磁盘映像文件。这些文件将是非常大的(100GB ~ 1.5TB)文件,其中填充了零。它应该在很短的时间内创建(尽可能地,至少它应该比带有“/dev/zero”的“dd”命令更快)。需要的大小会有所不同(这意味着我以前无法创建它)。 简单的解决方案(直到知道)是将文件创建为稀疏文件。 但是为什么我要更改解决方案是稀疏文件的某种缺点。

在我看来,直接编辑inode就可以解决。 我的想法是创建一个用零填充的非常大的文件,然后将其除以 inode 级别。或者我可以在连接这些文件以创建所需的文件大小之前创建很多 100 GB 的文件。 我知道“debugfs”可以编辑 inode 的直接块。由于“debugfs”用于文件恢复,也许,我可以用它来创建文件。但直到现在我才找到如何编辑 inode 的间接块。除了编辑间接块,我不确定直接编辑 inode 的副作用。

无论如何,是否有任何很酷的解决方案或工具(如果存在)用于“缝合”大文件或创建零填充文件? “cat” 命令或其他仅读写的解决方案可能无法解决我的问题。

【问题讨论】:

你说你想解释为什么但你从来没有解释过......但是,如果你需要用零填充的文件,你为什么不阅读/dev/zero 你需要多少? /dev/zero 正是我要建议的 :) //kimvais 谢谢您的回复。该文件是磁盘映像。我会将这些映像挂载到虚拟机上。 //paulsm4 我使用 dd commnad 像这样“dd if=/dev/zero of=/file bs=??k count=xx 并且我已经测试了推理块大小以找到最佳速度。但是所有这些都不符合我的要求。这就是我开始寻找其他解决方案的原因。 投了反对票,因为这个问题大部分时间都在谈论连接大文件,但显然只想分配它们:请参阅***.com/questions/257844/…。 fallocate 或稀疏文件是要走的路。您不能在以读写方式挂载的文件系统上安全地使用debugfs,因此这个想法不是很有用。 【参考方案1】:

如果您只想创建零填充文件,那么 fallocate 可能会很有用。从手册页

fallocate 用于将块预分配给文件。对于支持 fallocate 系统调用的文件系统,这可以通过分配块并将它们标记为未初始化来快速完成,不需要对数据块进行 IO。这比通过填充零来创建文件要快得多。

从 Linux Kernel v2.6.31 开始,btrfs、ext4、ocfs2 和 xfs 文件系统支持 fallocate 系统调用。

【讨论】:

感谢您的回答。但遗憾的是,我不能使用那个解决方案,df

以上是关于在很短的时间内连接非常大(~TByte)的文件的主要内容,如果未能解决你的问题,请参考以下文章

在很短的时间后多次播放音频文件?

Java11新特性解读

redis连接过多的一个解决方法

怎么设计一个秒杀系统

gulp的常用api

Maven 教程