覆盖映射文件中间数据的有效方法

Efficient way to overwrite data in the middle of an mmapped file

本文关键字:有效 方法 数据 中间 映射 文件 覆盖      更新时间:2023-10-16

我有一个文本文件,它被一个程序并发地写入,并被另一个程序读取。文件本身是一组键-值对,其中每对都在自己的行上,键和值由空格分隔。我已经将文件映射到两个程序的内存中(使用MAP_SHARED标志),并且我已经成功地使需要写入文件的程序在新用户提供的键值对的键不存在于文件中时非常有效地写入文件。

我现在正在努力解决的问题是,当用户输入一个新的键-值对并且该键已经存在于文件中时,有效地覆盖与键相关的值。

当新值与原始值相同或更少字节时,我可以简单地覆盖映射地址处的值,并且不必担心再次进行munmapping和mmapping。然而,当新值大于前一个值时,是否有一种有效的方法来处理这个问题?

谢谢

由于键和值具有限制值,因此您可以填充它们,这样您就不需要可变长度的行-只需为键和值留出5位数和10位数的空间。

当然,你有问题,如何保证内存映射区域是同步的,以及如何避免竞争条件。例如,posix似乎不能保证其他(读程序)程序在写入和msync调用之间看到的内容。

然后必须在文件中添加一些同步信息。例如,这可以通过在更新期间确保值无效来实现。例如,使用零填充值并将5作为第一个数字可以用作值正在更新的指示。你必须小心,但不要假设没有保证的事情。