2014-01-13 78 views
6

我想在C#中爲一個非常大的項目(+ 700MB)編寫搜索算法,並且由於缺乏經驗,我的代碼運行超過30數小時才結束/發現錯誤。我並不是要求任何人爲我做這件事,而是指向我一種算法,以便我可以學習,學習和實施它。在C#中尋找非常大的項目的文本文件搜索算法

項目:我有很多鍵和值(如負載文件)的文本文件,姑且稱之爲INI文件。我也有許多文件夾中的很多文件的巨大項目。對於每個這些INI密鑰,我必須:

1)搜索整個項目(而不是INI文件)以確保每個密鑰都被加載。每個值將分別載入一個名爲LoadIniValue()的函數。如果某個值沒有在這些函數中調用,我將不得不最終從INI文件中刪除它。

2)在此LoadIniValue()函數中,您還將容器的值存儲在該容器中,作爲參數傳遞。使用該參數作爲新的搜索關鍵字,是否在項目中的任何位置使用(構造函數或析構函數除外)?如果該參數未被使用(評估,讀取等),我將不得不最終從INI文件中刪除它。

這個項目的目標是有一個乾淨的INI文件,沒有未使用的參數。

我真的希望這會被認爲是一個有效的問題,有人可以提供線索。

非常感謝這個社區幫助我學習。你們真的很棒!

+1

我會用數據庫代替;) –

+0

@TimSchmelter:我想到了一個散列表,但由於項目不斷變化,它會需要很多時間嗎? – ElAlarconSoy

+0

你能再解釋一下嗎?如果我理解正確(而且我很可能不會),那麼在這裏發生的是,您打開項目中的每個文件,並查看它是否包含.ini文件中的任何鍵。那麼,無論發現什麼值都不應該從.ini文件中刪除?這就是你的項目的實質嗎?此外,您正在搜索的文件是什麼樣的,您打開的每個單獨的文件有多大?你現在怎麼去搜索它們? –

回答

3

您需要一個索引代理。不要以爲你需要從頭開始設計它。 我會用Lucene索引這些文件並使用它的API來獲取輸出。

+0

不確定我可以因爲我的工作的結果將被一家公司使用,但是將會非常仔細地研究它 – ElAlarconSoy

0

按照你的描述你的代碼確實是這樣的僞代碼:

foreach (entry in INI) 
    foreach (file in ProjectFiles) 
     Search for entry 

如果這是你會搜索所有文件INI文件的每個鍵的情況。您的文件很可能不會發生太大的變化,我們可以預料,在您搜索這些值時,它們根本不會改變。

然後,您只能通過您的文件運行一次,並在LoadIniValue()方法中構建所有使用的密鑰列表。接下來,您可以檢查INI文件中的條目是否在使用的密鑰列表中。如果不是,它可以被刪除。這將導致更少的文件必須被讀取並且使用更少的IO應該更快地運行。

0

它看起來像你需要通過兩遍這樣做。

在第一遍中,搜索所有源文件以調用LoadIniValue()。存儲正在使用的密鑰的名稱以及容器。在此通行證結束時,您有一個在代碼中使用的key, container對的列表。

將其與INI文件中的鍵匹配。 INI中存在但不在key, container列表中的任何密鑰未被使用。列表中但不在INI文件中的任何密鑰可能都是錯誤的。

現在再通過源代碼來確定列表中的哪些容器實際上在構造函數和析構函數之外使用。

這應該執行得非常快。大概在10分鐘或更少。你沒有說在700 MB中有多少個文件,但我懷疑有不少。如果文件很小,您的主要瓶頸就是打開文件。用我上面建議的方法,你只需要打開每個文件兩次。如果我完全理解你的問題,你當前的實現是打開每個INI鍵和每個容器名稱的每個文件。

如果您當前的代碼正常工作,而您只是想加快速度,您可能只需將所有文件加載到內存中一次,然後在內存中執行所有搜索。這將消除多次打開和讀取每個文件的開銷。我不會感到驚訝,看到給你10倍的性能提升。它不會像我上面提出的雙通解決方案那麼快,但它可能已經足夠好了。