以“安全”方式更新磁盘上的两个相关文件?

时间:2011-03-27 23:05:50

标签: python linux binary atomic

我有两个相互关联的二进制文件(意思是,当一个文件的记录更新时,另一个文件的匹配记录也应该更新)。这两个文件都是存储在磁盘上的二进制文件。

更新将如下所示:

UpdateFirstFile() - 第一个文件已更新.....

UpdateSecondFile() - 第二个文件已更新...

我应该使用哪些方法来确保更新BOTH文件或更新NONE文件?

这两个文件都是平面文件(每个文件大小为20 [MB])。我知道一个数据库可以解决这个问题,但我注意到由于开销原因使用一个(每个表需要存储超过20 [MB],而且我的空间很短并且有1000个这样的文件.. )。

有什么想法吗?

3 个答案:

答案 0 :(得分:4)

通用方法是使用某种回滚日志来实现transactions

例如,您可以使用单独的文件来记录每个文件中将受更新影响的每个部分的当前内容。交易完成后,您将删除日记文件。

启动事务时仅存在日志文件意味着另一个事务处于待处理状态或已被中断。在这种情况下,您可以使用日志的内容来撤消在中断之前经历的任何文件更改。

这样您就可以确保更新操作的atomicity。我将ACID的任何其他部分作为练习留给读者。

请记住,这样做正确的方式比听起来更难,特别是如果您有多个进程更新相同的文件。

答案 1 :(得分:2)

执行RDBMS引擎的工作。

在每个文件中写一个“更新序列号”。

您无法保证两个文件都已写入。

但是,您可以比较更新序列号以查看文件是否具有相同的序列号。

如果序列号不一致,则逻辑上等同于没有写入文件。删除文件并使用备份副本。

如果序列号为gree,则它在逻辑上等同于已写入的两者。

答案 2 :(得分:0)

  

这两个文件都是平面文件(大小   每个20 [MB])。我知道数据库会   我已经解决了这个问题   注意由于开销原因使用一个   (每张桌子都需要更多   超过20 [MB]存储,我是   空间不足,有1000多个   文件...)。

您可以尝试HDF5 format (designed to store and organize large amounts of numerical data)将两个数据集存储在一个文件中,或者存储所有数据(所有1000个文件)。它可能比重新实现数据库事务更简单。