磁盘文件 多次读取,每次读固定小下 与 一次读取全部 性能高低

tmpacc 2009-06-18 09:20:53
如果磁盘上有一文件大小为2MB,所有处理过程以一行为单位
1. 每次读取一行(小于512B), 处理,再次读取一行,再处理.....直到处理完(N次)
2. 每次读取固定缓冲区大小,如(8192KB)
3. 一次读取2MB,处理

这两种方式,哪种效率高?


我个人感觉,第3种方式效率最低,因为占了太多内存.

看了一些文章说多次读写磁盘会有性能瓶颈,

但我想不明白,为什么会这样,因为我觉得,不管哪种方式,都是从磁盘上读取2MB的数据,对磁盘的访问量都是一样的.有些文章说磁盘读写是有缓冲的,也就是说不管你一次读取1字节,还是1MB字节,读写函数每次读写的数据量都是一样的.

换个说法就是,假设文件大小为2MB,磁盘读写以4KB为单位,那我现在要读一行(512B)的时候,读写函数仍然会读4KB,--读完整个文件发生了2MB/4KB次操作;
如果我现在要读取固定缓冲(40KB),那么磁盘读写操作会发生10次,每次仍是4K,--读完整个文件发生了2MB/4KB次操作
如果我现在要读取全部,那么磁盘读写操作会发生2MB/4KB次,每次仍是4K, --读完整个文件发生了2MB/4KB次操作
不知道我的分析对不对.
...全文
364 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
liang118038liang 2009-06-22
  • 打赏
  • 举报
回复
Open后没关闭,基于缓存的原理应该没区别 !!
tmpacc 2009-06-18
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 pipisi 的回复:]
没有通用的,具体问题具体分析
[/Quote]
那你应该看看cat, grep, gawk, sed等有没有文件大小限制
pipisi 2009-06-18
  • 打赏
  • 举报
回复
没有通用的,具体问题具体分析
tmpacc 2009-06-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 pipisi 的回复:]
如果文件比较小,第3种方法应该是最好的;

否则,个人认为第2种比较好,当然缓冲区大小不同,性能也不同,经验值4k的整数倍比较好
[/Quote]
我想使文件处理具有通用性,不关心文件具体大小,我所列出的大小都是举例子的
pipisi 2009-06-18
  • 打赏
  • 举报
回复
如果文件比较小,第3种方法应该是最好的;

否则,个人认为第2种比较好,当然缓冲区大小不同,性能也不同,经验值4k的整数倍比较好
tmpacc 2009-06-18
  • 打赏
  • 举报
回复
或者问,如果我只需要按行处理数据的话,不对原文件做任何修改,是不是用fgets最合适
但我看到很多源码里面读取行操作,全是自定义函数, fgetc 一个字符一个字符的读,直到换行符...
这个效率与fgets一样吗?
liushac 2009-06-18
  • 打赏
  • 举报
回复
顶下
tmpacc 2009-06-18
  • 打赏
  • 举报
回复
不知道这个文问题不是等同于问:fgets 与 fread 哪个效率更高
tmpacc 2009-06-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 mengde007 的回复:]
学了操作系统就知道这是不一样的;磁盘的磁头是要移动的;
[/Quote]
这点我倒没考虑到,你的意思应该是说,我先读取一部分数据,处理的过程中,磁头可能因为读写其它文件而移到很远的地方,当我再次需要读的时候,它又回从远处再移回来
不知道我的理解对不对

但是我现在想,文件的每一块在磁盘上都不是连续存放的,哪怕我一次性读这个文件,也有可能读文件的A块,磁头在C点,而读B块,磁头又移动D点,而C与D距离是磁盘的直径
当然我举了一个极端的情况
  • 打赏
  • 举报
回复
如果磁盘上有一文件大小为2MB,所有处理过程以一行为单位
1. 每次读取一行(小于512B), 处理,再次读取一行,再处理.....直到处理完(N次)
2. 每次读取固定缓冲区大小,如(8192KB)
3. 一次读取2MB,处理

基于缓存的原理,你这3个操作,在本质上效率基本没有区别。
mengde007 2009-06-18
  • 打赏
  • 举报
回复
学了操作系统就知道这是不一样的;磁盘的磁头是要移动的;
可以通过使用HDD Regenerator软件,来达到我们轻松修复硬盘坏道的目的。HDD Regenerator本身就是一款功能强大的硬盘修复软件,它采用了“反向磁化”工作原理,通过软件指令迫使磁头产生于磁介质本身相应的高低电平信号,通过多次的往复运动对损坏或者已失去磁xxx的硬盘扇区进行反复加磁,使得这些扇区的磁介质重新获得磁能力,从而达到通过修复硬盘坏道而获得硬盘坏道再生工作能力的目的。而且HDD Regenerator软件还具有主界面简捷、非常容易操作的特点。 首先要创建启动盘:汉化软件,一看就会用,我们首先创建usb启动盘,按照提示操作就行。然后重启电脑, 》选着usb启动,软件自动在U盘运行 》然后选择硬盘,填数字,按回车,如果一块硬盘直接回车 》选择1 》进入修复硬盘坏道操作:在这里就可以直接键入坏道开始的位置,不过为了保险起见,还是以稍前一些的位置填入,然后按下回车键既可以进行修复了。 当HDD Regenerator软件扫描到硬盘坏道时会在进度条上显示红色的“B”字符,随后就开始自动修复,修复好以后会以蓝色的“R”字符标注。扫描并修复完以后就可以正常地使用硬盘了。 使用中要注意的问题:第一由于这款软件都是针对磁盘底层进行操作的,强烈建议做好重要数据的备份工作。第二虽然HDD Regenerator软件单独运行也可以,但是由于无法得知硬盘坏道的数量和准确的位置,所使用的时间会更长,因此建议朋友们先用软件检测出硬盘坏道位置,然后使用。 HDD Regenerator 唯一可以修复硬盘物理坏道的工具,它并不是简单的屏蔽坏道,他会真正的恢复屏蔽 欢迎使用"硬盘再生器",一个可令硬盘起死回生的特殊软件,它可以清除硬盘表面的物理坏道,不是隐藏,而是真正的修复坏道! 工作原理工: 差不多60%以上的硬盘坏道是由于硬盘表面磁化错误造成的,我们的研究取得了突破xxx进展,已经找到了产生高低信号特殊序列的算法,这些信号由软件产生,它们将对受损的盘面进行转换,即使低级格式化也做不了这个工作。 " 硬盘再生器"的优势 -----HDDR通过将磁xxx逆转来使坏道再生。如果您的硬盘有坏道,不仅影响使用,而且还有可能造成所存储的信息丢失,HDDR将使您的硬盘得到再生(差不多60%的受损硬盘是可以修复的)。结果是,不可的受损信息被修复,现有的信息不会受到影响。 最低系统环境-----本软件是针对Windows操作系统做了优化的,直接在Windows 95/98/ME环境下九可以直接开始修复过程。在Windows NT/2000/XP/win7操作系统下HDDR也是可以使用的,就是制作引导盘,制作启动usb设备,简单易用。 如何使用本软件-----在电脑上安装HDDR,打开HDDR后就可以开始修复、建立修复引导软盘、购买或注册了。如果您使用的是非注册版本,您就只能修复找到的第一个坏道。未注册的演示版本的主要目的是显示出已注册完整版能够修复的坏道信息,这个信息在修复过程结束后会显示在屏幕上,注册版会仔细地检测硬盘盘面并且修复所有找到的坏道。 要开始修复,请启动HDDR的控制台(Console Application),这个控制台将会执行修复工作。如果在Windows 95/98/ME下,您可以直接启动控制台;如果在Windows NT/2000/XP/win7下,您可以建立可引导的修复软盘、光盘、USB启动盘等。 成功启动软件后进入控制台------在启动的控制台后,1、选择要修复的硬盘;2、输入起始参数值。如果您想对整个硬盘进行扫描,就将此参数设为0。如果您不想从头扫描硬盘,就输入一个起始参数值。比如,您知道硬盘的开头5G是好的,为了节省时间不想扫描这开头的5G,您就可以将起始参数值设置为带m的 5000m或不带m的2560000(扇区数5000X512=2560000);3、等待扫描过程结束。如果您使用的是未注册版本,屏幕上会显示出已注册完整版将能修复的坏道报告。如果您使用的是已注册版本,您会发现已修复的坏道报告被保存在了hddreg.log文件当中。 重要提示--HDDR直接工作于硬件底层,不会影响硬盘的逻辑结构。即使您的硬盘已经得到修复,文件系统有可能仍会保持着早先所标记的坏道信息,如果您想清除这些早先的坏道信息,可以用PQ(分区魔术师)之类的软件对硬盘重新分区

69,371

社区成员

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

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