2011-02-27 2 views
0

가능한 중복 :
do searching in a very big ARPA file in a very short time in java자바에서 특정 형식의 매우 큰 파일의 문자열을 검색하려면 어떻게해야합니까?

내 파일의 형식 :

N- 그램 1 = 19

N- 그램 \

\ 데이터 2 = 234

,536,913 63,210

N- 그램 3 = 1,013

\ 1 g :

puluh -1.7132 -3.8008

사투 -1.9782 -3.8368

\ 2 g :

-1.5403 dalam 듀아 -1.0560

-3.1626 달램 이니 0.0000

\ 3 그램 :

-1.8726 ITU 단 TIGA

-1.9654 ITU 단 용 다운로드

당신은 내가 N- 그램 1 라인의 번호를 가지고 볼 수 있듯이 \ 끝 \

, 2 및 3. 전체 파일을 읽을 필요가 없습니다. 입력 문자열이 1 단어 문자열 인 경우 프로그램은 \ 1-grams : 부분 만 검색 할 수 있습니다. 입력 문자열이 2 단어 문자열 인 경우 프로그램은 \ 2-grams : part 등을 검색 할 수 있습니다. 마지막으로 프로그램에서 파일의 입력 문자열을 찾으면 문자열의 왼쪽과 오른쪽에있는 두 개의 숫자를 반환해야합니다. 또한 파일의 각 부분이 정렬되었다고 말해야합니다. 파일을 완전히 읽을 필요가 없으며 색인 파일을 사용하여 문제를 해결할 수 없다고 확신합니다. 이 방법은 많은 시간을 필요로하며 제 강사는 큰 파일을 검색하는 데 1 분 이내에 완료해야한다고 말했습니다. 가장 좋은 방법은 파일의 바이트가 아닌 특정 줄로 건너 뛰는 방법을 찾는 것이지만 어떻게 할 수 있는지 알지 못합니다. 누군가 내 문제를 해결하도록 도울 수 있다면 좋을 것입니다.

내 파일은 거의 800MB입니다. 나는 BufferedReader를 사용하는 것이 파일을 매우 빨리 읽을 수있는 좋은 방법이라는 것을 발견했다. 그러나 큰 파일을 읽고 줄 단위로 배열에 넣으면 30 분 이상 걸린다.

+0

이 숙제가 있습니까? (당신은 강의를 언급합니다). 지금까지 뭐 해봤 어? 질문을 편집하고 지금까지 시도한 코드 중 일부를 보여줄 수 있습니까? – jmq

+0

이것은 http://stackoverflow.com/questions/5127640/do-searching-in-a-very-big-arpa-file-in-a-very-short-time-in-java와 동일한 질문입니다. – andersoj

+0

음 전에는 잘 알고있는 구조와 바이트를 가지고 있지 않으면 파일 전체를 스캔해야합니다. 어떤 식 으로든 파일의 바이트 위치를 기록하고 파일 상단에 색인을 붙일 수 있다면 AFAIK는 없습니다. –

답변

1

파일의 크기는 어느 정도입니까? 1 분은 매우 긴 시간입니다. 효율성을 위해 BufferedReader를 사용하는 것이 좋습니다 (또한 readLine 메서드 사용).

  1. 강제로 파일의 모든 라인은 같은 길이로 : 그건 정말 너무 오래 걸리면

    는 두 가지 방법은 인덱스를 사용하지 않는 떠오른다. 그런 다음 시작을 계산하여 특정 행으로 이동할 수 있습니다. 필요한 줄 번호를 모르는 경우 적어도 전체 파일의 이진 검색을 효율적으로 수행 할 수 있습니다.

  2. \으로 시작하는 줄이 나올 때까지 임의의 위치로 건너 뛰고 앞으로 읽습니다. 그것은 당신이 옳은 부분을 찾았는지, 또는 당신이 점프 한 임의의 위치에서 그곳으로 또는 그 뒤로 앞으로 나아갈 필요가 있는지를 알려줍니다. 또한 필요한 데이터에 대한 이진 검색 전략을 만드는데도 사용할 수 있습니다. 부품의 시작에 대한 신뢰할 수있는 지표 인 \에 의존합니다.

+0

한 줄로 건너 뛰어도 여전히 \ n을 찾은 다음 줄 번호를 매기므로 시작할 때 파일을 읽는 것이 효율적이지 않습니다. –

+0

@Shekhar_Pro 수정 된 이진 검색의 가장 중요한 솔루션을 놓친 것 같습니다. 네, 읽는 모든 줄은 전체 줄을 읽어야합니다. 그러나 파일의 중간 (하나의 탐색 작업, 모든 바이트를 읽어서 거기에 도달 할 필요가 없음)을 발견하고 다음 섹션 제목을 찾아 원하는 섹션이 절반 전 또는 후반에 있는지 확인하면 제거 된 것입니다 거의 절반의 파일을 읽었습니다. 당신이 결정한 덩어리에서 다시 그렇게하면 파일의 다른 1/4이 제거됩니다. –

+0

@Shekhar_Pro - 모든 줄이 동일한 길이 (내 제안 # 1)이면 '\ n'을 계산할 필요가 없습니다. 원하는 라인을 시작하는 위치로'seek()'하면된다. 모든 라인이 같은 길이이기 때문에 알 수있다. –

관련 문제