覆盖映射文件中间数据的有效方法
Efficient way to overwrite data in the middle of an mmapped file
我有一个文本文件,它被一个程序并发地写入,并被另一个程序读取。文件本身是一组键-值对,其中每对都在自己的行上,键和值由空格分隔。我已经将文件映射到两个程序的内存中(使用MAP_SHARED标志),并且我已经成功地使需要写入文件的程序在新用户提供的键值对的键不存在于文件中时非常有效地写入文件。
我现在正在努力解决的问题是,当用户输入一个新的键-值对并且该键已经存在于文件中时,有效地覆盖与键相关的值。
当新值与原始值相同或更少字节时,我可以简单地覆盖映射地址处的值,并且不必担心再次进行munmapping和mmapping。然而,当新值大于前一个值时,是否有一种有效的方法来处理这个问题?
谢谢
由于键和值具有限制值,因此您可以填充它们,这样您就不需要可变长度的行-只需为键和值留出5位数和10位数的空间。
当然,你有问题,如何保证内存映射区域是同步的,以及如何避免竞争条件。例如,posix似乎不能保证其他(读程序)程序在写入和msync
调用之间看到的内容。
然后必须在文件中添加一些同步信息。例如,这可以通过在更新期间确保值无效来实现。例如,使用零填充值并将5作为第一个数字可以用作值正在更新的指示。你必须小心,但不要假设没有保证的事情。
相关文章:
- 在C++中初始化向量映射的最有效方法
- 将此布尔值传递给此函数的最有效方法是什么?
- 比较C++变量的最有效方法
- 在 c++ 中解决段树以外的范围查询的有效方法是什么?
- 存储变量的更有效方法是什么?
- 确保套装新鲜度的有效方法
- 当映射包含字符串向量作为值时,从值中获取键的有效方法
- 映射唯一值和重复值的有效方法.可以访问键或值的位置
- 在C++事务之间存储大量字符数据的有效方法
- 在unordered_multimap中精确迭代一次每个键的有效方法
- 一种将 Dart 中的字节数据转换为 C++ 中的无符号字符*的有效方法?
- 检查两个向量是否并行的最有效方法
- 从浮点数中删除小数部分但保留类型的有效方法
- 传递非泛型函数的最有效方法是什么?
- 按升序打印矢量的所有元素直到它为空而没有重复项的最有效方法是什么?
- 创建字符串数组的有效方法
- 返回一个引用C++中另一个类对象的对象的有效方法
- C++去除前x个元素的有效方法,在不改变向量大小的情况下将第x+1个元素推到第一个
- 将一种数据类型的向量复制到同一数据类型的结构向量中的有效方法是什么
- 从std::map值中获取密钥的有效方法