删除文件的开头而不重写整个文件

时间:2014-06-16 08:57:18

标签: c++ c linux file-io

我有一个嵌入式Linux系统,它将数据存储在一个非常大的文件中,并将新数据附加到最后。随着文件大小增加到填充可用存储空间附近,我需要删除最旧的数据。

问题是,我无法真正接受移动大量数据所需要的中断#34; up"该文件与正常情况一样 - 长时间锁定文件只是为了重写它(加上这是闪存介质,它会导致闪存不必要的磨损)。

最简单的方法可能是将文件拆分成多个较小的文件,但这有几个与数据处理和处理方式相关的缺点 - 所有客户端都是'软件需要单个文件。 OTOH它可以处理'腐败'将第一个记录切成两半,因此文件不需要在记录偏移处进行修整,只是在那里的某处,例如,最初几个iNode被释放。无论如何,最旧的数据已经过时,因此文件开头的更严重的损坏是完全可以接受的,只要“尾巴”这样。保持清洁,自由可以被取消多少确切地去除 - 大约几个第一兆字节'没关系,不需要先准确地说4096KB'精度。

是否有某些方法,API,技巧,黑客来截断文件的开头?

3 个答案:

答案 0 :(得分:10)

您可以使用上面的Linux内核v3.15实现ext4 / xfs文件系统的目标。

int ret = fallocate(fd, FALLOC_FL_COLLAPSE_RANGE, 0, 4096);

见这里 Truncating the first 100MB of a file in linux

答案 1 :(得分:6)

旧应用程序最简单的解决方案是使用FUSE文件系统,它可以访问底层文件,但偏移量会循环移位。这将允许您在物理级别实现环形缓冲区。 FUSE层非常简单,因为它只需要通过常量的模数文件大小来调整所有文件位置。

答案 2 :(得分:0)

如何设置一个单独的进程,当输出文件达到预定义的大小时重命名该输出文件(例如通过在文件名末尾添加linux时间)。

这将允许您保留旧数据,主进程将在下次写入时重新创建输出文件。

另一个cron作业可能会不时删除旧文件。