![]() |
1
2
如果您的数据量很小,您可以尝试其他一些原子同步到磁盘的方法。一种方法是将整个数据集存储在一个文件名中,用该文件名创建一个空文件,然后删除旧文件。如果启动时存在两个文件(由于极不可能出现崩溃时间),请删除旧文件并从新文件恢复。
另一种非常标准的方法,只要您的数据不是太大以至于磁盘上放不下两个拷贝,就可以工作:只要用临时名称创建第二个拷贝,然后
|
![]() |
2
4
任何你在一个小时内写入内存的东西
一般来说,安全的方法是将数据的完整一致性副本写入临时文件,同步临时文件,然后在先前的检查点文件上对其进行原子重命名。这是确保检查点之间的崩溃不会导致文件不一致的唯一方法。任何复制较少的解决方案都需要更复杂的事务日志样式的文件格式,并且对应用程序的其余部分更具侵入性(需要在内存状态更改的每个位置调用特定的钩子)。 |
![]() |
3
2
你可以的
或者
同步完成后,你的副本就可以写了
--编辑-- Can the dirtiness of pages of a mmap be found from userspace? 了解如何查看哪些页面是脏的。 |
![]() |
4
2
正如其他受访者所建议的那样,我不认为有一种便携的方式可以不复制就做你想做的事情。如果您希望在一个可以控制操作系统等的专用环境中执行此操作,那么您可以在Linux下使用btrfs文件系统执行此操作。
btrfs支持新的
|
![]() |
5
-1
我高度怀疑这可能不会被任何操作系统利用,但操作系统可能会注意到以下优化:
操作系统 能够 可能的好处是,在您写入特定页面之前(其他人也没有这样做),操作系统可能只会使用该位置的实际文件页面作为该页面的交换。 然后当你写这些页面的时候,操作系统会 复制 写 这些页面用于您的流程,但仍保留原始文件备份的未写入页面。
然后,一接到电话
尽管如此,如果这种优化不是由任何操作系统完成的话,我也不会感到惊讶,这种类型的代码最终会非常慢,并且在调用“write”时会导致大量磁盘写入。如果它被利用了,那就太酷了。 |
![]() |
Petr · 在Go中同步文件系统(syncfs) 10 年前 |