请教一个外排序硬盘读写的问题

zihany
紫寒 2010-12-28 字数 1382

闲来重做当年大二时数据结构大作业的外排序,在优化中遇到一个问题,不知道诸位是否

有人遇到过。

读一个1G的文本,文本中就是普通的字符串。

我把问题描述成两个程序

情况1:

在这个测试程序中,我只做读的操作,就是申请了一个20M大小的字符数组buffer,然

后用fin.read(buffer,XXX)命令从文本文件中读取字符串到buffer,循环重复上述过程5

0次,将文本读完,在循环过程中统计每次读取的时间,发现基本是稳定的,浮动很小,

完全可以理解,测试中我还故意干点别的事情,访问硬盘,发现没有影响;

情况2:

在这个测试程序中,我同样做了50个循环,但在每个循环中,先做一次20M字符串的读

入,再向硬盘中写20M的数据。就是读写交错进行。然后统计每个循环的读入用的时间和

写用的时间。发现在这种情况下读入操作耗时极不稳定,开始时一般和测试程序1中的时

间一样,但是在几个到十几个循环之后,会突然出现一个剧增,同时会听到硬盘的咔咔声

,这个剧增出现后,读入耗时平均值会整体上升。剧增出现的时机不稳定,有时在循环过

半时出现,有时三五个周期后就出现。但多次测试中,没有一次正常稳定运行到最后,最

迟的一次在循环35次出现。但肯定的是,只要一次剧增出现,后面读入时间就会稳定到一

个显著大于正常值的值。

但是写操作的耗时一直比较稳定。偶尔会出现剧增,但不会保持。

我重启电脑,关掉一切无用进程后测试,一样。把程序发到别人电脑上测试,也是一

样。

因为我不是很清楚硬盘的读写愿意,不理解一直读和读写交替会对耗时带来怎样的影

响。有同学知道的话请不吝赐教,我还真卡在这里了。也不记得上学的时候大家都是怎么

做的,当年我仿佛根本没有想到这个程度。

多谢诸位。

Algorithm 算法
2 个回复
ColinYu
Colinyu 2011-01-01

这个问题问的好,我也期待答案

【 在 zihany (紫寒) 的大作中提到: 】

: 闲来重做当年大二时数据结构大作业的外排序,在优化中遇到一个问题,不知道诸位是否

: 有人遇到过。

: 读一个1G的文本,文本中就是普通的字符串。

: ...................

wxstorm
企鹅 2011-01-01

磁盘读写涉及

寻到时间+旋转时间+读数据时间

你如果只读不写的话,前两步基本没了

但如果读写的话,如果写的地方不在刚读的那个地方,前两个的时间就比较大了,是物理移动时间

当然操作系统也会优化。

还有,这种程序别用fin。直接用C的fread速度估计会快不少

【 在 zihany (紫寒) 的大作中提到: 】

: 闲来重做当年大二时数据结构大作业的外排序,在优化中遇到一个问题,不知道诸位是否

: 有人遇到过。

: 读一个1G的文本,文本中就是普通的字符串。

: ...................