2009-06-11 75 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以毫秒爲單位完成的,用戶將無法實現其走動的時候,而不是讀整個數據提前