Chinaunix

标题: 大文件的小批量修改 [打印本页]

作者: jiangf    时间: 2009-03-13 17:14
标题: 大文件的小批量修改
我这里有一个很大的数据文件1个G左右,可是我要改的只是其中的一两个字节的数据;怎么改比较好
我不想把整个文件都拷到缓存中再改,这样的IO太频繁了
作者: beepbug    时间: 2009-03-13 17:41
你知道待修改数据的位置吗?如果知道,你就定位到那里,然后做修改。系统只读入它所在的那一块。

你该把问题描述清楚。
作者: xinglp    时间: 2009-03-13 18:04
知道位置就好办,
作者: langue    时间: 2009-03-13 18:17
鸵鸟政策一下:mmap(2)
等等……你的文件有1个G?也许 mmap() 会失败。还是先定位再 seek 吧。
作者: jiangf    时间: 2009-03-14 15:29
我试了一下先用fseek定位到文件的指针
然后用fwrite()写要覆盖的值,特别是打开文件时要以r+的方式打开,而不能用rw的方式打开
作者: 皇家救星    时间: 2009-03-14 16:37
如果只是要加几个字符呢? 不仅是修改
作者: xinglp    时间: 2009-03-14 16:47
标题: 回复 #6 皇家救星 的帖子
末尾加还好写,开头或者中间加就得倒腾文件了
作者: 皇家救星    时间: 2009-03-14 17:46
我也是这样想的,但是这样做真的太浪费了

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

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

为了不到1k的数据要折腾20G的数据量 真不划算
作者: which    时间: 2009-03-14 19:13
有讨论的工夫,都做完了.几个G的数据而已,不要小看现在的CPU.
作者: xinglp    时间: 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 />

你要调整业务逻辑?
作者: 皇家救星    时间: 2009-03-15 13:24
标题: 回复 #9 which 的帖子
我试过6G的,用了半个小时以上,

如果只有一个倒还行,关键是这种应用还是蛮多的
作者: agaric    时间: 2009-03-15 13:39
如果数据很大就不适合这样简单的存储啦。数据库??




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2