在mmapped文件中间覆盖数据的有效方法

时间:2015-10-16 05:05:30

标签: c++ file-io hashmap mmap

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

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

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

谢谢

1 个答案:

答案 0 :(得分:1)

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

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

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