***问一个大批量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。
...全文
569 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
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()放到循环的外面。
另外,最好把要写的位置按照前后排好序依次写。

70,024

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧