【发布时间】:2014-06-16 08:57:17
【问题描述】:
我有一个嵌入式 Linux 系统,它将数据存储在一个非常大的文件中,并将新数据附加到末尾。随着文件大小增长到接近可用存储空间,我需要删除最旧的数据。
问题是,我真的不能接受像往常一样将大量数据“向上”移动到文件所需要的中断 - 长时间锁定文件只是为了重写它(加上这是闪存介质,会对闪存造成不必要的磨损)。
可能最简单的方法是将文件拆分为多个较小的文件,但这有几个与数据处理方式相关的缺点 - 所有“客户端”软件都需要单个文件。 OTOH它可以处理将第一条记录切成两半的“损坏”,因此不需要在记录偏移处修剪文件,只需在“某处”,例如前几个 iNode 被释放。最旧的数据无论如何都是过时的,所以文件开头更严重的损坏是完全可以接受的,只要“尾部”保持干净,并且可以随意删除多少数据 - “大约前几兆字节”是可以的,不需要“精确的前 4096KB”精度。
是否有一些方法、API、技巧、黑客可以像这样截断文件的开头?
【问题讨论】:
-
@fedorqui:“没有(便携式或文件系统中立) 方法可以从文件的开头(或中间)删除字节”。我要的是非便携式和非 fs 中性的。
-
@SF。尽管存在差异,但您可能会发现答案很有用。特别是 Joni 的链接到描述
EXT4_IOC_TRUNCATE_BLOCK_RANGE的页面,这可能对您有用。 -
如果您假设文件大小固定,您可以尝试基于文件的环形缓冲区实现 (i.e.)
-
@qarma:实际上,稀疏文件的技巧听起来不错。如果最大数据增长速度约为 3MB/月,文件需要很长时间才能增长到不合理的尺寸。