多线程文件访问

时间:2009-06-11 18:54:42

标签: multithreading file

我正在编写一个十六进制编辑器程序,我正在考虑用户何时尝试打开一个非常大的文件(3GB +)。我不希望用户整天坐着来加载整个文件,因为它已经加载了一些数据。

所以这是我的问题,是否有可能让多个线程同时在不同的地方读取文件(而不是写入),然后一旦某个阈值的数据读取1,该线程就会显示其数据而其他人继续阅读?这会为我带来性能提升吗?或者内存带宽是否会降低使用多线程可以获得的任何速度增益?

6 个答案:

答案 0 :(得分:4)

对于十六进制编辑器,没有必要将整个文件读入内存。用户只能查看或修改数据,但不能插入或删除。

您可以简单地使用内存映射文件。访问时将自动读取数据,只读取显示的块。这样可以快速滚动并跳转到文件中的任何位置。

答案 1 :(得分:3)

您可能不想使用多个线程。即使在多核CPU上,仍然只有一条通向磁盘的路径,因此您可能无法获得性能提升(磁盘访问 比内存慢)。

虽然加载并一次显示少量内容,但您有一个好主意。只需在一个帖子中执行此操作。大致读取第一个兆字节,显示它,然后在后台执行下一个等等。

你是对的,你可能想要一个单独的GUI线程。这是BeOS与当时其他操作系统相比如此令人难以置信的响应的原因之一。它使用许多不同的线程来完成不同的任务。

不要指望从磁盘读取多个线程来提供帮助。

此外,您可以使用aio_read()在Linux上执行异步IO。如果您正在使用Windows,只需尝试使用Google“异步io”(我不确定您是如何操作的;我不使用Windows)。

答案 2 :(得分:3)

我不确定你期望的性能提升。 。 。磁盘上有一个数据流,从磁盘读取多个线程只会增加争用,并且由于磁盘头因竞争请求而来回反弹,可能会造成速度减慢。

您应该考虑使用异步IO,并在数据进入时尽快处理数据,以使应用程序显示响应。

答案 3 :(得分:1)

忘记阅读整个文件。只需在用户需要时读取小块。它在十六进制编辑器上更容易,因为内容不会影响布局。

在几毫秒内完成屏幕上的数据读取,用户在移动时不会意识到它已经完成而不是提前读取整个数据

答案 4 :(得分:1)

正如@bill所说,你会想要使用内存映射文件。我想你会发现以下教程很有价值:

上述教程应该为您提供所需的所有信息。

答案 5 :(得分:0)

我认为你最好使用异步的非阻塞I / O.这意味着您可以发送读取请求,然后继续处理,然后再去取得请求的结果。因此,单个线程可以重叠处理和I / O.一些谷歌搜索将为您的平台找到API文档。