2012-05-17 1 views
1

A-H에서부터 40 억 개의 무작위 문자를 생성하여 Java의 텍스트 파일에 저장하려고합니다. 카운터가 4B에 도달 할 때까지 반복의 기본 방법을 시도했지만 항상 메모리 문제가 발생한다는 것을 알았습니다.향후 조작을 위해 많은 문자 시퀀스를 생성하는 최적의 방법

문자를 기본 값이 아닌 비트로 문자를 저장하는 것이 더 효율적인 메모리인지 궁금합니다. 다음과 같이 :

A <- 000, B <- 001, C <- 010, D <- 011, E <- 100, F <- 101, G <- 110, H <- 111 

만약 그렇다면 어떻게해야합니까?


나는이 모든 무작위로 생성 된 문자 텍스트 파일을 일단 가장 좋은 방법은 수정을 할 수있는 txt 파일을 열어 무엇을 할 것, 앞서를 찾고 계십니까? 예 : 몇자를 대체하거나 추가합니다. 자바 튜토리얼을 살펴본 후 랜덤 액세스 파일이 트릭을 수행 할 것이라고 생각하지만 더 나은 옵션이 있습니까?

개행 줄 바꿈 기능을 중지 지점으로 허용하려면 n 개의 문자마다 줄 바꿈을 추가해야합니까?

내 질문에 간결하게 설명하는 것은 다음과 같습니다. 텍스트 파일에 4Billion 무작위 제한 문자 (모두 26 개가 아님)를 효과적으로 생성하여 나중에 읽을 수 있도록 수정하려면 어떻게해야합니까?

+2

* ".. in JAVA"* 제목에 태그를 추가 할 필요가 없으며 'JAVA'가 아니라 'Java'임을 유의하십시오. –

+1

죄송합니다! 다음에 기억할거야. – bigbitecode

+0

'다음에 기억할 것입니다'에 +1. :) –

답변

0

우선 스토리지를 최적화하려면 byte 유형을 사용하십시오. 바이트는 문자를 원래 값으로 저장할 수 있기 때문에 아무 것도 변경할 필요가 없습니다.

원래 저장을 수행하는 가장 좋은 방법은 FileOutputStream이고 세대를 "페이지"지정하는 것입니다 (예 : 100 메가 바이트마다 작성).

더 많은 파일 구현이 필요하면 RandomAccessFile이 좋습니다. 나는 당신이 이미 파일에 가지고있는 모든 "정보 단위"의 길이를 알고 있기 때문에 새로운 라인을 추가하는 것이 좋을 것이라고 생각하지 않으며, 새로운 라인을 추가하는 것은 저장 공간을 복제 할 것입니다. 나는 분명히 (그리고 만드는 의미) 만들 수

희망 :

그것이 어떻게 갔는지 말해.

+0

안녕 후안, 응답 주셔서 감사합니다. 추천 해 주셔서 감사합니다. 바이트 유형을 사용해 보겠습니다. 두 번째 부분에 대해서는 사실 혼자 남겨두고 계획을 세우지 만 4Billion 시퀀스에 임의로 문자열 시퀀스를 삽입합니다. 예 : [임의로 삽입 된 "EEEEEEE"시퀀스] ABCDHHHCB ... ... HADCDCHBADC [\ EOF]. -> ABCD [EEEEEEE] HHHCB ... HADCDCHBADC [\ EOF] – bigbitecode

+0

나는 분류의 개념을 이해하지 못합니다. 그 질문과 무슨 상관이 있습니까? A-H에서 문자를 정렬하는 것은 문제가되지 않습니다. –

+0

오, 미안 해요, 제가 업데이트 드리겠습니다 –

0

그래서 3 가지 비트로 8 가지 값을 저장할 수 있습니다. 따라서 바이트로 2x3 비트를 저장하거나 24/8 = 3 바이트로 8x3 비트를 저장할 수 있지만 문자로 저장하는 것은 24 비트에서 'A'- 'H'의 3 문자만을 의미합니다.

8/3의 절약이므로 15 억 바이트가 절약됩니다. 그러나 간단한 예제를 만들려면 8로 나눌 수없는 시퀀스를 저장해야한다고 가정하면 코드에 사용되지 않는 바이트가 생깁니다.

001 000의 BA를 저장해야합니다. byte to 0010 : 0000 B와 어떻게 구별합니까? B는 단지 001 일 뿐이므로 가득 채우면 0010 : 0000이됩니다.

확인. 파일 길이가 1.5GB 인 파일의 경우, 마지막 바이트의 몇 비트가 사용될 것인지 알려주는 단일 바이트를 항상 추가 할 수 있습니다. 위의 예에서는 6을 추가하고 3을 추가하면 한 번 추가합니다.

하지만 이제는 무언가를 삽입해야합니다.바이너리 시퀀스는 항상 3 비트로 이동하지만 비 8- 삽입이없는 경우 다음 바이트를 읽고 비트 스트림에 추가 할 수는 있지만 다음 바이트를 모두 바꿔야합니다. 두 개의 부분으로 나누고 첫 번째 부분을 오버런에 추가하고 두 번째 부분을 다음 바이트의 오버런으로 유지합니다.

구현이 너무 까다로울 수는 없지만 런타임에 어떤 영향을 미치는지는 알 수 없습니다.

아마도 통계 분석이 도움이 될 수 있습니다. 얼마나 자주 문자가 추가되고 얼마나되는지. 어떤 크기로 얼마나 자주 삽입됩니까?

아마도 파일을 청크로 구성하는 것이 더 쉬울 것입니다. 어쩌면 2MB의 1000 파일, 각각에 추가 할 여유 버퍼가 들어 있습니다. 마지막 바이트는 파일의 내용으로 간주되는 바이트 수를 지정할 수 있습니다.

데이터 삽입이 어떻게 지정됩니까? "AHA"라는 시퀀스를 위치 2 713 345 947에 삽입 하시겠습니까? 아니면 "FACHDAG" "BACH"의 세 번째 시퀀스 다음에 삽입합니까? 자연어로 된 단어와 같이 일반적으로 반복되는 시퀀스가 ​​있습니까?

첫 번째 경우 외부 색인이 매우 유용 할 수 있습니다. 찾아 볼 수 있다면 1000 파일 중 2,713,345,947 위치는 평균 1.5km의 50 %를 읽어야 할 필요성이 크게 높아집니다.

그러나 통계 분석이 필요합니다. 파일이 커지거나 더 많거나 적게 같은 크기로 유지됩니까? 얼마나 자주 읽고 쓰는지. 업데이트가 삽입, 추가, 삭제됩니까?