***问一个大批量fwrite()时候,效率差的问题!!---100分

shantian 2004-03-26 11:17:19
我的test.dat文件中,存储的是STRUCT B结构的信息,共3万多条。我现在需要对其中记录的某个值iVar进行修改,比如,由1改成0。
另外,需要更改的记录信息存储在一个map里,一个记录,对应着一个该记录在文件中的位置。根据这个位置,来fwrite(),把相关值由1改成0。

我发现,当需要更改的记录很多的时候,速度就会越来越慢。不知道为什么?

我是用一个for循环来写的
{
fseek(fp,lPosition,SEEK_SET);
fwrite(&iFlag,sizeof(int),1,fp);
fflush(fp);
}

其中,lPosition是记录在文件的位置,iFlag=0。
...全文
189 点赞 收藏 13
写回复
13 条回复
zouxueping 2004年03月26日
读写文件都是非常需要时间的操作,所有实用软件都是先在内存中处理,最后一次写入文件。
平时我们读写文件,系统都是在缓冲区操作,直到超出一块的范围(通常是512字节)或操作完成才真的写到硬盘上,也就是说文件操作的基本单位是一块,你只动一个字节也照样得读写一块。你每写一个字,就调用了fseek函数,这个函数会强制进行读写操作,所以,你每个循环都要进行一次写操作和一次读操作,还要寻址,这种程序在循环次数多时是不切实际的。
回复 点赞
shantian 2004年03月26日
也就是说,我写入的话,不是一直向前写的,是不定的饿。
回复 点赞
shantian 2004年03月26日
我要写的并不是连续的文件区域,所以,怎么一次写入呢?

不从头,那从当前的话,有个问题,比如,我当前的位置是100,我现在需在位置97上写,这不还是需要从头开始吗?
回复 点赞
junnyfeng 2004年03月26日
每次都从文件头开始寻址当然慢!
回复 点赞
psbeond 2004年03月26日
试试把内容读入内存,然后改好后一次写入文件
回复 点赞
shantian 2004年03月26日
不知道为什么这样。
回复 点赞
nobush 2004年03月26日
不如另建一个新的,
把原文件大段大段地读入,整理后再把修改后的内容写入一个新文件……
回复 点赞
AutoAsm 2004年03月26日
1. 可能是fseek(fp,lPosition,SEEK_SET);原因。虽然理论上ansi file操作是随机访问,但具体实现可能有不同
2. fflush(fp);放到循环外面,改完了再写盘(我在windows和linux上从来不用这个函数,这个函数的实现可能是空的)
3.如果还不行,那就自己在内存中操作,完成后一次写硬盘
回复 点赞
zouxueping 2004年03月26日
先把写的位置按前后排序,再一次读入一大块文件,比如说1M,然后把这一块的内容改完后再写回去,继续后面的,如果不会用远指针的话就一次读64K以下。
回复 点赞
yjh1982 2004年03月26日
用API的"叠加写'(overlay..)功能.
回复 点赞
shantian 2004年03月26日
给位给个解决方案呀.目前考虑到效率,所以只好求助于大伙.
回复 点赞
wythust 2004年03月26日
随机存取,肯定都有个查找读/写位置,再读/写的过程啊,你的数据多,查找就慢,这是无可避免的啊,我觉得你的程序是合理的
回复 点赞
pacman2000 2004年03月26日
把fflush()放到循环的外面。
另外,最好把要写的位置按照前后排好序依次写。
回复 点赞
发动态
发帖子
C语言
创建于2007-09-28

3.2w+

社区成员

24.0w+

社区内容

C语言相关问题讨论
社区公告
暂无公告