Ner*_*ron 5 c++ windows mfc file windows-server-2008
我正在使用Windows 7上的本机C++/Win32/MFC应用程序.我正在使用CFile打开存储在远程服务器上的文件(带有标志,CFile :: modeRead | CFile :: shareDenyWrite).服务器正在运行Windows Server 2008,我通过常规Windows文件共享访问共享驱动器上的文件.一旦我打开文件,我就按照下面的描述阅读它.
首先,我正在寻找文件中的多个位置(10个位置)和读取小(128个字节)的部分.然后,我正在寻找开头并顺序阅读整个文件.
我注意到的是,执行上述操作比打开文件并通读它要慢得多.初始随机搜索和采样非常快,即使使用大文件也几乎是即时的.有趣的是,即使这很快,下一部分,扫描文件的速度非常慢,而只是在没有初始随机访问的情况下进行扫描.
在试图弄清楚发生了什么时,我拉起了性能监视器并观察了网络流量.如果我只是通过文件执行顺序读取,我通过无线适配器下载3.5MB/s.如果我首先随机搜索,那么顺序读取我在顺序读取期间只获得300kB/s.
解决方案是在执行随机访问部分后关闭并重新打开文件.当我这样做时,顺序读取加速.
所以似乎做随机访问读取(搜索和读取)在服务器上做了一些事情,然后导致顺序读取缓慢.我想知道,有没有人知道这里发生的事情是什么,我看到的行为的实际原因是什么?虽然我已经解决了这个问题,但我想更好地了解引擎盖下发生的事情.
Mooing Duck的评论是正确的.操作系统开始假设顺序访问为"软"选项 - 启用直到被证明有害.但是随机访问导致预读使性能变差,并且"智能"缓存行为会提前读取.
你会认为一些顺序访问会导致Windows重新打开它.但不幸的是,此时旗帜不再"软".Windows认为从那时起就证明了随机访问,就像你强迫它进入那种模式一样.
您可以通过CreateFile该FILE_FLAG_SEQUENTIAL_SCAN选项强制它继续预读,无论如何.但是你重新开放的解决方案可能与任何东西一样好.如果你不CreateFile直接打电话,这是唯一的方法.
| 归档时间: |
|
| 查看次数: |
1148 次 |
| 最近记录: |