2011-07-20 41 views
0

我想加載一個非常大的文本文件(大小約11 GB)並執行一個函數(基本上將文件分解成不同的部分)。我需要幫助將加載函數多線程化爲8個左右的線程,並且在加載函數期間,執行這個特定的排序功能。 (我不能詳細討論sort函數)。C++中的多線程:加載一個大文件並執行一個函數?

這些都在C++中。我沒有限制公羊(我有大約60 GB)。

+2

你需要更多的磁盤,而不是更多的CPU。 –

+0

您可以提供有關文件內數據大小的更多詳細信息,並在此粘貼一些代碼。這將有助於爲您的問題提供更合適的解決方案 –

+1

根據Hans Passant的評論,瓶頸容易成爲磁盤讀取速度。也許需要一些你的記憶,做一個漂亮的VDISK,或者使用一個快速的SSD。這應該有助於將瓶頸轉移回您的CPU。 –

回答

0

你可以將文件分割成塊並將加載函數傳遞給fseek偏移量,這樣你的加載函數就可以從fseek開始的文件中讀取一段時間(並將其加載到內存中),然後在線程(使用您的祕密排序算法)。因此,讓我們說,把文件大小除以8並計算fseek偏移量,或者您可以採用固定大小的塊並讀取,直到用完文件內容來處理(映射11gb的HD內容到RAM需要一段時間並且相當多資源,所以你可能想要做這個增量)。你能理解這個嗎?

+0

嗯......我們可以試試。我們迄今爲止所嘗試的是讓用戶輸入線程的數量,並將文件以這種方式分成塊。你的想法似乎有效,我可以嘗試。由於某種原因,當我們放入8個線程時,似乎只有2個線程能夠完成他們的工作,一個人聲稱它幾乎是瞬間共享(大約1.2GB),另外5個線程則不做任何事情。至於我們的資源,我沒有什麼可擔心的。 –

+0

我猜是有磁盤爭用,因爲從磁盤加載1GB是很多頁(1GB/4KB),因此操作系統可能需要一段時間才能滿足這些請求。你在你的實施中使用fseek,或者你是如何分區的? –

+0

這個解決方案很可能會耗盡磁盤讀取緩存,並且使整個過程比全部在單個線程中慢,因爲每個線程都會將磁頭髮送到不同的物理位置。在允許的同時讀取數量方面也可能存在控制器限制。所有的硬件都依賴於tbh。 –

0

一個線程可以加載到內存塊中,將每個塊傳遞到它自己的線程進行處理,以便可以儘早開始處理。我不認爲有多個線程同時嘗試從同一個文件中讀取是個好主意。

+0

這很有道理,儘管在內存中處理文件的速度比加載文件的速度快,所以在下一個文件甚至有機會啓動之前線程可能會完成。取決於I/O與CPU排序有多大的關係。 –

0

解決方案1:預訂FILE_SIZE存儲器堆中,啓動一個線程用於讀取該文件,報告回只要讀取命中DATA_READED/NUMBER_OF_DESIRED_THREADS_FOR_PROCESSING值開始其處理readed數據的塊從存儲器中的線程,遞增讀指針通過DATA_READED/NUMBER_OF_DESIRED_THREADS_FOR_PROCESSING。重複。

解決方案2:預訂FILE_SIZE存儲器,創建NUMBER_OF_DESIRED_THREADS_FOR_PROCESSING和相同數目的隊列,讀數(對於磁盤IO再次一個線程)時,當一個組塊被readed分配緩衝器指針和數據的大小爲處理經由線程的隊列一些鎖定機制。這樣,只要數據可用,所有線程都將開始工作。

漢斯帕桑特是正確的,如果你能使用更多的磁盤,那麼你應該分配多個線程讀取塊

相關問題