我正在读取一个文件,我要么读取一行数据(1600 次连续读取 17 字节)或一列数据(1600 次读取 17 字节,以 1600*17=27,200 字节分隔)。该文件位于本地驱动器或远程驱动器上。我读取了 10 次,因此我希望在每种情况下读取 272,000 字节的数据。
在本地驱动器上,我看到了我的期望。在远程驱动器上按顺序阅读时,我也看到了我的期望,但是在阅读一列时,我看到大量额外的阅读正在完成。它们的长度为 32,768 字节,似乎没有被使用,但它们使读取的数据量从 272,000 字节跃升至 79 MB 到 106 MB 之间的任何位置。这是使用进程监视器的输出:
1:39:39.4624488 PM DiskSpeedTest.exe 89628 ReadFile \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP SUCCESS 偏移量:9,390,069,长度:17 1:39:39.4624639 PM DiskSpeedTest.exe 89628 FASTIO_CHECK_IF_POSSIBLE \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP 成功操作:读取,偏移:9,390,069,长度:17 1:39:39.4624838 PM DiskSpeedTest.exe 89628 ReadFile \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP 成功偏移:9,388,032,长度:32,768,I/O 标志:非缓存,分页 I/O,同步分页 I/O,优先级:正常 1:39:39.4633839 PM DiskSpeedTest.exe 89628 ReadFile \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP SUCCESS 偏移量:9,417,269,长度:17 1:39:39.4634002 PM DiskSpeedTest.exe 89628 FASTIO_CHECK_IF_POSSIBLE \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP 成功操作:读取,偏移:9,417,269,长度:17 1:39:39.4634178 PM DiskSpeedTest.exe 89628 ReadFile \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP SUCCESS 偏移量:9,444,469,长度:17 1:39:39.4634324 PM DiskSpeedTest.exe 89628 FASTIO_CHECK_IF_POSSIBLE \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP 成功操作:读取,偏移:9,444,469,长度:17 1:39:39.4634529 PM DiskSpeedTest.exe 89628 ReadFile \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP 成功偏移:9,441,280,长度:32,768,I/O 标志:非缓存,分页 I/O,同步分页 I/O,优先级:正常 1:39:39.4642199 PM DiskSpeedTest.exe 89628 ReadFile \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP SUCCESS 偏移量:9,471,669,长度:17 1:39:39.4642396 PM DiskSpeedTest.exe 89628 FASTIO_CHECK_IF_POSSIBLE \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP 成功操作:读取,偏移:9,471,669,长度:17 1:39:39.4642582 PM DiskSpeedTest.exe 89628 ReadFile \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP SUCCESS 偏移量:9,498,869,长度:17 1:39:39.4642764 PM DiskSpeedTest.exe 89628 FASTIO_CHECK_IF_POSSIBLE \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP 成功操作:读取,偏移:9,498,869,长度:17 1:39:39.4642922 PM DiskSpeedTest.exe 89628 ReadFile \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP 成功偏移:9,498,624,长度:32,768,I/O 标志:非缓存,分页 I/O,同步分页 I/O,优先级:正常
注意 32,768 的额外读取,其中 I/O 标志设置为非缓存、分页 I/O、同步分页 I/O、优先级:正常。这些额外的读取将它从 272 KB 带到 106 MB 并导致缓慢。从本地文件读取或读取一行时它们不会发生,所以它们都是连续的。
我试过设置 FILE_FLAG_RANDOM_ACCESS 但它似乎没有帮助。关于导致这些额外读取的原因以及如何使它们停止的任何想法???
测试在 Vista 64 位系统上运行。我可以提供一个程序的源代码来演示这个问题,以及一个进行测试的控制台程序。