我有很多数据想以二进制形式保存到磁盘,我想尽可能接近具有 ACID 属性。由于我有大量数据并且无法将其全部保存在内存中,因此我知道我有两种基本方法:
有很多小文件(例如每分钟左右写入磁盘) - 如果发生崩溃,我只会丢失最后一个文件。然而,性能会更差。
有一个大文件(例如打开、修改、关闭) - 之后的最佳顺序读取性能,但如果发生崩溃,我最终可能会得到一个损坏的文件。
所以我的问题是:
如果我选择使用大文件选项并将其作为内存映射文件(或使用Stream.Position
and Stream.Write
)打开,并且断电,是否可以保证文件可能会发生什么?
是否有可能丢失整个大文件,或者最终导致数据在中间损坏?
NTFS 是否确保一定大小(4k?)的块总是被完全写入?
Unix/ext4 上的结果更好/更差?
我想避免使用 NTFS TxF,因为微软已经提到它计划停用它。我正在使用 C#,但语言可能无关紧要。
(补充说明)
似乎应该有一定的保证,因为 - 除非我错了 - 如果在写入文件时可能会丢失整个文件(或遭受非常奇怪的损坏),那么现有的数据库将不会是 ACID,除非他们1) 使用 TxF 或 2) 在写入之前复制整个文件?如果您丢失了您甚至不打算触摸的部分文件,我认为日记不会帮助您。
PIPIONE
ITMISS
相关分类