2012-03-31 72 views
1

我一直在試圖找出一種有效的方式來工作,而不使用緩衝區來搜索字節模式時從文件讀取兩次。我選擇實現Runnable,這樣我就可以將我的任務分配到併發線程中工作。我的代碼看起來是這樣的:從Java中的緩衝區進行有效模式搜索?

// constructor: initializes local variables. 
public BytePatternSearcher(RandomAccessFile raFile, byte[] pattern, int bufferSize, long startPos, long endPos); 

public void run() 
{ 
    while(amountToRead - raFile.read(buffer) > 0) 
    { 
     // search code 
    } 
{ 

現在,我已經打了一個障礙:我的算法工作在簡單的情況下,而不是在複雜的。我假定在已經被搜索的模式中沒有模式開始的情況,模式長度比緩衝器短,依此類推,一次只限制一次掃描,然後迭代文件。當然,這不是一個非常強大的解決方案。假設我有'xxxxx'(長度爲5)的模式,我的文件是'xxxxxxyxxxxxx',我的緩衝區大小是2(x和y代表某些字節值)。該字符串出現4次,每次檢查需要兩倍以上的緩衝區長度。

我怎樣去努力的事情了,不檢查相同的字節一次以上的所有情況?

+1

查找Knuth Morris Pratt算法。 – dasblinkenlight 2012-03-31 11:38:24

+1

我不認爲「設計模式」標籤是適用的 – 2012-03-31 11:53:55

+0

此時添加多個線程幾乎肯定是不成熟的優化,並且當您嘗試將整個文件加載到內存中時很可能會給您帶來內存不足的錯誤立刻。相反,使用順序算法(BM是一個不錯的選擇),跟蹤匹配,並且(1)在找到它們時處理它們,或者(2)不必擔心兩次讀取文件(因爲它的許多塊可能在OS緩衝區中)。 – kdgregory 2012-03-31 12:44:31

回答