在固定时间或非常快速前加到非常大的文件

我有一个非常大(> 500GB)的文件,我想用一个相对较小的头文件(<20KB)。 做如下的命令:

cat header bigfile > tmp mv tmp bigfile 

或类似的命令(例如sed)非常慢。

在现有大型文件的开头写入标题的最快方法是什么? 我正在寻找一个可以在CentOS 7.2下运行的解决scheme。 可以从CentOS安装软件包或更新repo,EPEL或RPMForge。

如果存在一些不涉及重定位或复制bigfile中的大量数据的方法,那将是非常好的。 也就是说,我希望有一个解决scheme可以在固定的时间内运行给定的头文件,而不pipe大文件的大小。 如果这是太多的要求,那么我只是要求最快的方法。

编译一个辅助工具(如C / C ++)或使用脚本语言是完全可以接受的。

Solutions Collecting From Web of "在固定时间或非常快速前加到非常大的文件"

这是否需要进行一次,以“修复”设计监督? 还是需要定期执行某些操作,例如将摘要数据(例如数据记录的数量)添加到文件的开头?

如果你只需要做一次,那么你最好的选择就是接受一个错误,并采取复古修复的后果。 只要你使你的目标驱动器不同于源驱动器,你应该能够在两个小时内修复一个500GB的文件。 所以经过一个星期的批处理过程后,你可能已经升级了三十或四十个文件

如果这是所有这些文件的标准要求,并且您认为只有在文件完整时才可以应用更改 – 也许是某种汇总信息 – 那么您应该在每个文件的开始处保留空格并保留空。 然后,只要找到标题区域并用提供的实际数据覆盖它,这是一件简单的事情

如上所述,标准文件系统需要复制整个文件,以便在开始时添加一些内容

如果您的500GB文件位于标准硬盘上,这将允许数据以每秒100MB左右的速度读取,那么读取整个文件需要5,120秒,或大约1小时30分钟

只要您将目的地安排为与源文件分开的驱动器,则您的文件大部分可以与读取文件并行地写入新文件,因此不应该花费太多的时间。 但恐怕除了这个之外,没有办法加快速度

如果你没有被绑定到CentOS 7.2,你的问题可以通过fallocate来解决(有些保留1 ),它提供了从Linux 4.2开始的ext4文件系统和从Linux 4.1开始的XFS文件系统所需的功能:

int fallocateint fdint modeoff_t offsetoff_t len );

这是一个不可移植的,特定于Linux的系统调用。 对于确保为文件分配空间的可移植,POSIX.1指定的方法,请参阅posix_fallocate(3) 。

fallocate()允许调用者直接操作由fd引用的文件的分配磁盘空间,以便从偏移量开始并继续len字节。

模式参数决定了在给定范围内执行的操作。 支持的操作细节在下面的小节中给出。

增加文件空间

模式中指定FALLOC_FL_INSERT_RANGE标志( 自Linux 4.1起可用 )将通过在文件大小内插入一个洞而不覆盖任何现有数据来增加文件空间。 该孔将从偏移处开始并继续处理len字节。 在文件中插入空洞时,从offset开始的文件内容将被len字节向上移(即,到更高的文件偏移量)。 在一个文件中插入一个洞使文件大小增加len个字节。

FALLOC_FL_INSERT_RANGE需要文件系统支持。 支持这个操作的文件系统包括XFS(自Linux 4.1)和ext4(自Linux 4.2以来)。


1 fallocate只允许在文件系统块大小的倍数下将数据预先加入文件。 所以只有在可以接受的情况下才能解决你的问题,用空格,注释等来填充额外的空间。


如果没有对fallocate() + FALLOC_FL_INSERT_RANGE的支持,您可以做的最好的是

  1. 增加文件(使其具有最终大小);
  2. mmap()文件;
  3. memmove()数据;
  4. 填写标题数据的开始。