我有一个非常大的文件(> 500GB),我希望用一个相对较小的标题(<20KB)作为前缀。执行以下命令:
cat header bigfile > tmp
mv tmp bigfile
或类似命令(例如,使用sed)非常慢。
将标头写入现有大文件开头的最快方法是什么?我正在寻找可以在CentOS 7.2下运行的解决方案。可以从CentOS安装或更新repo,EPEL或RPMForge安装软件包。
如果存在一些不涉及重定位或复制bigfile中的大量数据的方法,那将是很好的。也就是说,我希望能够在给定头文件的固定时间内运行的解决方案,无论bigfile的大小如何。如果要求太多,那么我只是要求最快的方法。
编译帮助工具(如在C / C ++中)或使用脚本语言是完全可以接受的。
答案 0 :(得分:7)
这是否需要做一次,以及#34;修复&#34;设计监督或许?或者是您需要定期执行的操作,例如将摘要数据(例如,数据记录的数量)添加到文件的开头?
如果您只需要做一次,那么您最好的选择就是接受错误并承担修复后果。只要您使目标驱动器与源驱动器不同,您就可以在大约两小时内修复500GB文件。因此,经过一周的批处理过程后,您可以升级大概三十或四十个文件
如果这是所有此类文件的标准要求,并且您认为只有在文件完成时才应用更改 - 可能是某种摘要信息 - 那么您应该在每个文件的开头保留空格把它留空然后,只需要提供标题区域并用真实数据覆盖它就可以了。
如上所述,标准文件系统需要复制整个文件才能在开头添加内容
如果您的500GB文件位于标准硬盘上,这样可以以每秒100MB的速度读取数据,那么读取整个文件需要5,120秒,或大约1小时30分钟
只要你安排将目的地作为一个独立的驱动器来源,你就可以与读取并行地写新文件,所以它不应该花费更长的时间。但除此之外,没有办法加快速度,我很害怕
答案 1 :(得分:5)
如果您没有受到CentOS 7.2的约束,fallocate可以解决您的问题(通过一些保留 1 ),从Linux 4.2开始为ext4文件系统提供所需的功能和Linux 4.1以来的XFS文件系统:
int fallocate ( int fd , int 模式, off_t 偏移, off_t len );
这是一个不可移植的,特定于Linux的系统调用。对于便携式, POSIX.1指定的确保为a分配空间的方法 文件,请参阅posix_fallocate(3)。
fallocate()允许调用者直接操作已分配的 fd 引用的文件的磁盘空间,用于字节范围的开始 在偏移并继续 len 字节。
模式参数确定要对其执行的操作 给定范围。支持的操作的详细信息在 以下小节。
...
增加文件空间
指定 FALLOC_FL_INSERT_RANGE 标记(自Linux 4.1以来可用) 在模式下通过在内部插入一个洞来增加文件空间 文件大小而不覆盖任何现有数据。洞会开始 在偏移并继续 len 字节。在内部插入孔时 文件,从偏移开始的文件内容将被移位 len 字节向上(即更高的文件偏移量)。插入一个 文件中的孔会使文件大小增加 len 字节。
...
FALLOC_FL_INSERT_RANGE 需要文件系统支持。文件系统 支持此操作包括XFS(自Linux 4.1以来)和ext4(自此 Linux 4.2)。
1 fallocate允许仅在文件系统块大小的倍数处将数据预先添加到文件中。因此,只有当您可以使用空格,注释等填充额外空间时,它才能解决您的问题。
如果不支持 fallocate() + FALLOC_FL_INSERT_RANGE ,您可以做的最好是