我正在创建一个归档程序,它分两步处理数据:
第二步线性处理临时存档文件,并在处理时将结果写入最终存档。因此,此过程需要两倍于存档文件的存储空间(暂时)。
我想避免双重存储需求。所以我的想法是,在处理过程中,我想告诉操作系统它可以删除临时文件的已处理部分。像截断调用一样,但它应该在开头截断文件,而不是结束。有可能做这样的事吗?
答案 0 :(得分:3)
写下所有数据。通过打开文件两次来移动数据:用于读取和以覆盖模式写入(注入目录并确保在读取块之前不覆盖)。
如果目录具有固定长度 - 则在文件中预先分配该大小以避免完全移位。
答案 1 :(得分:1)
像截断调用一样,但它应该在开头截断文件,而不是截断。有可能做这样的事吗?
不,使用普通文件是不可能的。但是,请查看特定于Linux的fallocate(2)(不可移植,可能不适用于所有文件系统),因此我不建议使用它。
但是,请查看SQLite和GDBM索引文件。它们提供了一个抽象(以上文件),使您能够“删除记录”。
或者暂时将所有数据保存在内存中。
或者考虑采用双通(或多次通过)方法。也许nftw(3)可能有用。
(今天,磁盘空间非常便宜,所以你要求避免双重存储需求真的很奇怪;如果处理大量数据你应该提到它)