2012-09-25 6 views
0

다음 목록을 작성하여 메모리 부족없이 파일로 저장할 수 있습니까?매우 큰 숫자 목록 작성 및 저장

li = 1:2^40; 

목록을 작성하여 청크로 작성하는 분명한 해결책을 알고 있습니다. 나는 더 우아한 방법이 있는지 궁금해했다. 그 목록은 메모리의 8.8 TB를 필요로하기 때문에

+1

목록 저장 기능이 필요한 것은 무엇입니까? 대부분의 경우 자연수의 하위 목록을 생성하는 것은 모든 자연수 (또는 그 중 큰 부분)를 저장하는 것보다 훨씬 더 우아한 접근 방식입니다. 저장 장치가 아닌 자연수를 나타내는 스트림을 게으른 평가로 생각하십시오. –

+1

물론 발전기를 사용하면 더욱 우아해질 것입니다. 하지만 필자는 전체 목록을 재 작성이 불가능한 오래된 프로그램과 호환되도록 작성해야합니다. – mac389

답변

2

, 여기에 필요되는 것을 방지하기 위해 사소한 해결책 :

loop_limit = uint64(2^40); 
ii = uint64(1); 
chunksize = 1000; 

fid = fopen('output.txt', 'w'); 
while ii < loop_limit 

    for jj = 1:chunksize   
     fprintf(fid, '%d\n', ii); 
     ii=ii+1; 
     if ii >= loop_limit 
      break; end  
    end 

end 

fclose(fid); 

이 없음 목록이 지금 어디 생성되지 않습니다; 메모리 오버 헤드는 사용되는 몇 가지 변수로 제한됩니다.

제공된 목록 (1:2^40)은 이중 루프의 원인 인 Matlab의 최대 루프 인덱스 인 2147483647을 초과합니다.

또한이 파일 output.txt은 8.8TB를 차지하므로, 먼저 하드 드라이브 공간을 확보하는 것이 좋습니다.

분명히, 이것은 절대적으로 무섭다. "이전"프로그램이 파일을 쿼리하는 방법에 대한 자세한 정보를 제공 할 수 있습니까? 나는 bash/DOS 배치 기법이 있다는 사실을 강하게 알고 있기 때문에 파일을 실제로 필요로하지 않고도이 숫자가 포함 된 파일을 에뮬레이트 할 수 있습니다.

+0

"오래된"프로그램은 이진 변수 그룹의 활동을 나타내는 숨겨진 마코프 모델을 재구성하는 C++ 프로그램입니다. 40 개의 변수가 있다면, 2^40 개의 인구 활동 상태가있다. 유한 오토 마톤은 유한 글자를 다루는 것만 알면되지만, 필자는 공동 작업자의 코드를 실제로 파고 들기까지 (내 논문이 끝날 때까지) 시간이 없다. 그리고 그는 혼자 기꺼이하지 않습니다. – mac389