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