我正在编写一个十六进制编辑器程序,我正在考虑用户何时尝试打开一个非常大的文件(3GB +)。我不希望用户整天坐着来加载整个文件,因为它已经加载了一些数据。
所以这是我的问题,是否有可能让多个线程同时在不同的地方读取文件(而不是写入),然后一旦某个阈值的数据读取1,该线程就会显示其数据而其他人继续阅读?这会为我带来性能提升吗?或者内存带宽是否会降低使用多线程可以获得的任何速度增益?
答案 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文档。