如何在没有双倍存储要求的情况下将文件从一个文件处理到另一个文件?

时间:2017-12-11 13:26:54

标签: linux file

我正在创建一个归档程序,它分两步处理数据:

  1. 创建临时存档文件
  2. 从临时存档文件中创建最终存档。创建最终存档后,删除临时文件
  3. 第二步线性处理临时存档文件,并在处理时将结果写入最终存档。因此,此过程需要两倍于存档文件的存储空间(暂时)。

    我想避免双重存储需求。所以我的想法是,在处理过程中,我想告诉操作系统它可以删除临时文件的已处理部分。像截断调用一样,但它应该在开头截断文件,而不是结束。有可能做这样的事吗?

2 个答案:

答案 0 :(得分:3)

写下所有数据。通过打开文件两次来移动数据:用于读取和以覆盖模式写入(注入目录并确保在读取块之前不覆盖)。

如果目录具有固定长度 - 则在文件中预先分配该大小以避免完全移位。

答案 1 :(得分:1)

  

像截断调用一样,但它应该在开头截断文件,而不是截断。有可能做这样的事吗?

不,使用普通文件是不可能的。但是,请查看特定于Linux的fallocate(2)(不可移植,可能不适用于所有文件系统),因此我不建议使用它。

但是,请查看SQLiteGDBM索引文件。它们提供了一个抽象(以上文件),使您能够“删除记录”。

或者暂时将所有数据保存在内存中。

或者考虑采用双通(或多次通过)方法。也许nftw(3)可能有用。

(今天,磁盘空间非常便宜,所以你要求避免双重存储需求真的很奇怪;如果处理大量数据你应该提到它)