2012-03-31 73 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

回答