2009-06-11 109 views
4

我正在编写一个十六进制编辑器程序,我正在考虑用户何时试图打开一个非常大的文件(3GB +)。我不希望用户在整个文件加载时都要整天坐下来加载。多线程文件访问

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

回答

4

对于一个十六进制编辑器完成的,没有NEAD阅读整个文件进入内存。用户只能查看或修改数据,不能插入或删除。

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

3

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

尽管加载和显示一点一点,但你有一个好主意。只需在一个线程中完成此操作。大致读取第一兆字节,显示它,并在后台执行下一步操作等。

而且你是对的,你可能需要一个单独的GUI线程。这是为什么BeOS与其他操作系统相比如此令人难以置信的响应的原因之一。它为不同的任务使用了许多不同的线程。

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

另外,您可以使用aio_read()在Linux上执行异步IO。如果您使用Windows,只需尝试使用Google搜索“windows asynchronous io”(我不太确定您是如何做到的;我不使用Windows)。

+1

所以也许有I/O是一个单独的线程从GUI? 然后,如果GUI试图查看尚未检索到的数据,则可以中断I/O线程并获取请求的数据。 – samoz 2009-06-11 19:07:46

+0

@Samoz - 这正是正确的做法 - 不要阻塞IO上的UI线程。 – Michael 2009-06-11 19:10:11

3

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

您应该研究一下执行异步IO,并在数据处理完成后立即处理数据,以保持应用程序的响应。

0

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

1

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

读取数据的screenfull以毫秒为单位完成的,用户将无法实现其走动的时候,而不是读整个数据提前