2012-06-25 61 views
1

我正在編寫一個多線程應用程序,截至目前,我有這個想法。我有一個FILE*[n],其中n是一個在運行時確定的數字。我打開所有n個文件進行讀取,然後多個線程可以訪問並讀取它。每個文件的數據計算是等效的,即如果假設串行執行,則每個文件將同時保留在存儲器中。在寫入文件時減少磁盤訪問次數C

每個文件都可以是任意大的,所以不應該認爲它們可以加載到內存中。

現在在這種情況下,我想減少發生的磁盤IO的數量。如果有人可以爲這種情況建議任何共享內存模型,那將是非常好的(我不知道我是否正在使用一個模型,因爲我對於實現的方式知之甚少)。我不知道該如何實現。換句話說,我只是想知道什麼是最有效的模型來實現這種情況。我正在使用C

編輯:更詳細的情況。

實際的問題是我有n個包含在n個文件中的數據的布隆過濾器,並且一旦文件中的所有元素都插入相應的布隆過濾器中,我需要做成員測試。由於成員資格測試是對數據文件的只讀過程,因此我可以從多個線程讀取文件,並且可以輕鬆並行處理此問題。現在有數據的文件數量相當大(大約20k,注意文件數等於布隆過濾器的數量),所以我選擇產生一個線程用於測試一個布隆過濾器,即每個布隆過濾器都有它自己的線程,將逐一讀取其他所有文件,並根據bloom過濾器測試數據的成員資格。我希望在這種情況下儘量減少磁盤IO。

+0

你在說什麼平臺?如果你在Linux上,最簡單的方法是將它們作爲內存映射文件打開,並讓操作系統處理它。 (我敢肯定,Windows有相同的功能。) –

+0

我在linux上。你能解釋一下嗎,請 –

+0

不確定你試圖通過共享內存分享?如果你正在考慮內存映射文件,那不會嚴重減少IO(你仍然必須閱讀所有你必須閱讀的東西)。爲什麼你認爲IO是一個問題?我認爲這裏沒有足夠的細節來給出有意義的建議......我注意到您的問題標題提到了寫入文件,但是沒有提及如何/在哪裏將文件寫入正文 John3136

回答

3

開始時使用mmap()函數將文件映射到內存中,而不是打開/讀取FILE *。之後產生讀取文件的線程。 通過這種方式,操作系統緩衝內存中的訪問,只在緩存變滿時執行磁盤io。

0

如果您的程序是多線程的,除非您採取措施創建線程本地存儲,否則所有線程都共享內存。您不需要直接共享內存。最小化I/O的方法是確保每個文件只讀一次(如果可能的話),並且類似地,結果文件每個只寫入一次。

你是如何做到這一點取決於你正在做的處理。 f每個線程負責整個處理一個文件,然後該線程簡單地讀取該文件;你不能再減少I/O。如果一個文件必須被多個線程讀取,那麼你應該嘗試對內存進行映射,以便它可以被所有相關的線程使用。如果您使用的是32位程序,並且這些文件太大而不適合內存,則無法進行內存映射。然後你需要計算出不同的線程將如何處理每個文件,並儘量減少不同線程重新讀取文件的次數。如果您使用的是64位程序,則可能有足夠的虛擬內存通過內存映射I/O處理所有文件。您仍然希望將訪問數據的次數降到最低。類似的概念適用於輸出文件。