I / O完成端口无声地无法完全读取

时间:2013-03-07 19:40:12

标签: windows file-io io-completion-ports

我正在开发一个程序,需要将大量数据写入磁盘,然后回读更少量的数据。它需要将相关数据“捆绑”在一起,然后一旦确定如何处理它,那么它就可以进一步处理数据。它基本上就像一个数据库,但在磁盘上有临时文件。临时文件的一部分被频繁地重用,因为在我将其读回后我并不关心磁盘上的数据,因此该部分文件可以被回收。我正在使用I / O完成端口来实现这一点,因为顺序I / O太慢了。

问题在于,有时当我读取数据时,我并没有全部恢复。例如,我将读取缓冲区归零,执行20个字节的读取操作,并且当相应的完成事件触发时,我的读取缓冲区中的一些甚至没有一个将与磁盘上的内容相匹配,但所有这些都是不会被清零。偶尔,我可以检测到这一点并尝试睡5秒并再次读取相同的部分,它与我在第一次尝试时读到的相匹配。这是在SSD的顶部进行的,所以5秒应该足以冲到磁盘上。但是,当我停止我的应用程序并查看文件的内容时,它在磁盘上是正确的。就像上一次写入没有刷新到磁盘并尝试读取旧数据一样。

为了测试这个理论,我尝试在读取它们时在整个部分写入0xFF。当再次发生此错误时,我的读缓冲区不包含0xFF,正如我所料。所以可能,我不是在读旧数据。

我还检查过以确保从完成事件返回的字节数与我传递给ReadFile的字节数相匹配,并且它们匹配。完成事件或ReadFile(ERROR_IO_PENDING除外)没有返回任何错误。我正在使用FILE_ATTRIBUTE_NORMAL,FILE_FLAG_OVERLAPPED和FILE_FLAG_RANDOM_ACCESS创建我的临时文件。

我还尝试在尝试读取之前等待文件的给定部分的所有挂起写入,但无济于事。我希望Windows会为我做这件事,但我读过的任何文档都没有涉及。

我真的不知道为什么我会看到部分或损坏的读取。我真的只是寻找一些可能导致这种行为的想法,因为我全都出去了。

1 个答案:

答案 0 :(得分:0)

从你发射的东西的声音写入和读取到同一文件的相同部分,有时读取的数据不是你以前写的那样。

我假设您在为文件的同一区域发出读取请求之前等待一段数据的写入完成?如果不是,写入完成之前可能会发生读取?当大量数据被写入同一磁盘时,写入完成可能开始变慢,写入可能会花费更多时间等待(注意这种消耗的资源!)

就个人而言,我会包含自己的内存缓存层,它知道数据块,直到写入完成 - 如果写入尚未完成,您可以从缓存中满足对该部分文件的读取。