0

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

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

为了验证这个理论,我在阅读时尝试在整个部分上写 0xFF。当这个错误再次发生时,我的读取缓冲区没有像我预期的那样包含 0xFFs。所以大概,我不是在阅读旧数据。

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

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

我真的不知道为什么我会得到看起来是部分或损坏的读取。我真的只是在寻找一些可能导致这种行为的想法,因为我全力以赴。

4

1 回答 1

0

从您对同一个文件的相同部分进行写入和读取的事情的声音来看,有时读取返回的数据不是您认为您以前编写的数据。

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

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

于 2013-03-09T14:51:55.357 回答