2012-08-14 3 views
0

문자 파일이 1.99GB입니다. 자, 예를 들어 위치 90에서 190, 10에서 110, 50000에서 50100 등 (각각 100 자 길이)에서 무작위로 해당 파일에서 수백만 개의 하위 시퀀스를 추출하고 싶습니다. 아무도 나를 도울 수있는 좋은 방법으로 할 수 있습니다.Java - 문자 파일에서 하위 시퀀스 추출

NB : 전체 파일을 메모리로 가져올 메모리가 충분하지 않습니다.

+0

순서가 서브 시퀀스입니까? 중복됩니까? 모든 하위 시퀀스 범위 (내용이 아니라 시작/끝 지점 만)를 메모리에 저장할 수 있습니까? 매우 대략적으로 파일의 몇 퍼센트가 하위 시퀀스에 있습니까? –

+0

@EdStaub, "하위 시퀀스가 ​​순서대로 있습니까?" - 아니, 무작위 야. "둘이 겹치 나?" 아마도. "모든 하위 범위 (콘텐츠가 아닌 시작/끝 지점)를 메모리에 저장할 수 있습니까?" - 나는 많은 기억을 가지고 있지만 곧 하위 시퀀스가 ​​필요할 때까지 기다릴 수는 없다. – Arpssss

+0

죄송합니다, 팔로우하지 않고 있습니다 - 무엇 때문에 기다려주십시오? –

답변

2

파일을 고정 크기의 여러 파일 (예 : 각각 16K)로 분할합니다.

char n을 읽을 때 n/filesize를 실행하여 파일을 가져옵니다. n % filesize를 사용하여 파일에서 시작 문자를 가져옵니다. 파일 꼬리 부분을 읽으려면 여분의 논리를 추가하고 다음 파일을 읽거나 각 파일에 다음 100자를 추가하십시오 (그리고 다음 파일에 복제하십시오).

물론 원래 파일 만 사용하고 열기/실행시마다 seek을 수행 할 수 있습니다. 그러나 나는 그것의 성능에 대해 잘 모르겠다, 그리고 그것은 다른 OS와 격렬하게 다를 수 있습니다.

옵션 2 : 많은 임의의 색인을 생성하고 순서를 지정하십시오. 그런 다음 파일 (RandomAccessFile 또는 FileInputStream)을 한 번 스윕하고 모든 체인을 가져옵니다. 그것은 HD 시간을 최소화 할 것이고, 문제는 그것들을 주문하는데 필요한 색인/시간을 저장하기 위해 필요한 메모리를 제어 할 것이다. 또한 캐릭터가 두 개 이상의 체인에 속할 경우 추가 된 복잡성이 있습니다.

+0

그런 식으로 생각합니다.하지만 꽤 비싼 방법 일 수 있습니다. – Arpssss

0

시도해 볼 수 있습니다 RandomAccessFile - 파일을 임의의 위치로 찾고 필요한 문자를 읽을 수 있습니다.

+0

1.99 GB 파일을 지원합니까? – Arpssss

+0

@Arpssss 2Gb보다 약간 작습니다. 그렇습니다. 파일이 2Gb보다 큰 경우 문제가있을 수 있습니다 (여기 http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4116672 참조). –

+0

RandomAccessFile이 FS 위에 구현 된 방법에 대한 의문점이 있습니다. 예를 들어 FAT에서는 원하는 블록에 도달하기 위해 모든 블록을 읽습니다. 사용은 쉬울 것이지만 좋은 성능을 제공하지는 못합니다. – SJuan76

0

인덱스를 시작하여 필요한 하위 시퀀스를 정렬합니다.

이제 걷기 시작하십시오. RandomAccessFile을 사용하여 필요한 다음 하위 시퀀스의 시작 지점에서 시작하는 디스크 블록을 가져옵니다.

블록의 크기는 적중률에 따라 결정됩니다 (블록의 나머지 부분이 유용 할 가능성이 얼마나 높습니까?) - 적중률이 높을수록 블록이 커야합니다 (물론 포인트까지). 하위 시퀀스 목록을 미리 살펴보고 그에 맞게 블록 크기를 조정하는 것이 좋습니다. 블록에서 모든 하위 시퀀스를 꺼내십시오. 완료 될 때까지 반복하십시오.

다른 곳에서 언급 된 2GB가 넘는 파일의 문제점을 이해할 수 없습니다.