免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5612 | 回复: 6
打印 上一主题 下一主题

如何修改一个文件的内容 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-12-12 14:43 |只看该作者 |倒序浏览
最近想写个简单的文件数据库,需要能够修改数据行中的数据。
浏览了一些解决方案,主流思想是重新创建一个文件,将未修改数据和修改后的数据拷贝过去。然后删除原先文件,重命名新文件。
这固然是一个方法,但是这能满足性能上的要求吗?
有谁能讲讲mysql和其他数据库是如何处理此类问题的?

论坛徽章:
0
2 [报告]
发表于 2010-12-12 17:20 |只看该作者
数据量大,并且更新频繁的话,复制-删除的方式,性能是不能接受的。

1. 如果修改后的数据行,没有变长的话,可以原地修改。
2. 如果数据会变长,但是总是有限的话,可以采用预留的方法。比如现在占5个字节,但是实际行占8个字节。5个字节,修改为8个字节以内,都可以参照第1种方式处理。
3. 如果现有行是无论如何也不够用了。可以删除,然后在文件尾添加一个新行。
4. 也可以为现有行添加一个指针,指向该行新增字节的位置。

论坛徽章:
0
3 [报告]
发表于 2010-12-12 17:40 |只看该作者
回复 2# zzyong08


    前两方案是说采用定长的行数据大小,在合法范围内读写。
    第三个也能理解。
    第四个方案就不是太明白了。麻烦说的详细些

论坛徽章:
0
4 [报告]
发表于 2010-12-13 10:02 |只看该作者
回复 3# 82wutao

为简化,假如这行就一个字段,叫做a,a原来占5个字节,现在变成100个了,无论如何原来的地方是放不下了,新增的95个字节无处安放。这时,可以把这95个字节放到另外的地方,a预留出一个指针位,指向这个地方。当读取a时,读取原来位置的5个字节,在根据指针找到另外的95个字节,拼接为完整的100个字节。

我觉得这种方法,虽然可能提高磁盘使用率,但是实现的复杂度很高,而且二次磁盘读取,效率会差点。

论坛徽章:
0
5 [报告]
发表于 2010-12-13 11:01 |只看该作者
mmap

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2010-12-13 11:02 |只看该作者
errno 是易失的

论坛徽章:
0
7 [报告]
发表于 2010-12-13 11:02 |只看该作者
前提是不能扩大文件
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP