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

크 누스 모리스 프랫 알고리즘을 찾습니다. – dasblinkenlight

+1

"design-pattern"태그가 적용 가능하지 않다고 생각합니다. –

+0

이 시점에서 여러 스레드를 추가하는 것은 조기 최적화입니다. 전체 파일을 메모리에로드하려고 할 때 메모리 부족 오류를 줄 가능성이 큽니다 한 번에. 대신 순차 알고리즘 (BM은 좋은 선택)을 사용하고 일치 항목을 추적하며 (1) 찾기로 처리하거나 (2) 파일을 두 번 읽는 것에 대해 걱정하지 마십시오 (블록의 대부분 OS 버퍼에 있음). – kdgregory

답변