免费注册 查看新帖 |

Chinaunix

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

[C] 大文件的小批量修改 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-13 17:14 |只看该作者 |倒序浏览
我这里有一个很大的数据文件1个G左右,可是我要改的只是其中的一两个字节的数据;怎么改比较好
我不想把整个文件都拷到缓存中再改,这样的IO太频繁了

论坛徽章:
0
2 [报告]
发表于 2009-03-13 17:41 |只看该作者
你知道待修改数据的位置吗?如果知道,你就定位到那里,然后做修改。系统只读入它所在的那一块。

你该把问题描述清楚。

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:172015亚冠之水原三星
日期:2015-06-02 16:34:202015年亚冠纪念徽章
日期:2015-10-19 18:13:37程序设计版块每日发帖之星
日期:2015-11-08 06:20:00
3 [报告]
发表于 2009-03-13 18:04 |只看该作者
知道位置就好办,

论坛徽章:
0
4 [报告]
发表于 2009-03-13 18:17 |只看该作者
鸵鸟政策一下:mmap(2)
等等……你的文件有1个G?也许 mmap() 会失败。还是先定位再 seek 吧。

论坛徽章:
0
5 [报告]
发表于 2009-03-14 15:29 |只看该作者
我试了一下先用fseek定位到文件的指针
然后用fwrite()写要覆盖的值,特别是打开文件时要以r+的方式打开,而不能用rw的方式打开

论坛徽章:
0
6 [报告]
发表于 2009-03-14 16:37 |只看该作者
如果只是要加几个字符呢? 不仅是修改

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:172015亚冠之水原三星
日期:2015-06-02 16:34:202015年亚冠纪念徽章
日期:2015-10-19 18:13:37程序设计版块每日发帖之星
日期:2015-11-08 06:20:00
7 [报告]
发表于 2009-03-14 16:47 |只看该作者

回复 #6 皇家救星 的帖子

末尾加还好写,开头或者中间加就得倒腾文件了

论坛徽章:
0
8 [报告]
发表于 2009-03-14 17:46 |只看该作者
我也是这样想的,但是这样做真的太浪费了

比如我只要在一个10G的文件开头加上一行

这样我就要先写这一行,然后读文件,将文件追加到后面

为了不到1k的数据要折腾20G的数据量 真不划算

论坛徽章:
0
9 [报告]
发表于 2009-03-14 19:13 |只看该作者
有讨论的工夫,都做完了.几个G的数据而已,不要小看现在的CPU.

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:172015亚冠之水原三星
日期:2015-06-02 16:34:202015年亚冠纪念徽章
日期:2015-10-19 18:13:37程序设计版块每日发帖之星
日期:2015-11-08 06:20:00
10 [报告]
发表于 2009-03-14 20:45 |只看该作者
原帖由 <i>皇家救星</i> 于 2009-3-14 17:46 发表 <a href="http://bbs3.chinaunix.net/redirect.php?goto=findpost&pid=10208003&ptid=1392919" target="_blank"><img src="http://bbs3.chinaunix.net/images/common/back.gif" border="0" onload="if(this.width>screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onmouseover="if(this.width>screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open(this.src);}" onmousewheel="return imgzoom(this);" alt="" /></a><br />
我也是这样想的,但是这样做真的太浪费了<br />
<br />
比如我只要在一个10G的文件开头加上一行<br />
<br />
这样我就要先写这一行,然后读文件,将文件追加到后面<br />
<br />
为了不到1k的数据要折腾20G的数据量 真不划算
<br />

你要调整业务逻辑?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP