2012-09-22 2 views
2

메모리에 들어 가지 않는 대용량 파일로 작업해야합니다. 그렇지 않은 경우에도 특정 부분을 찾아 수정해야하기 때문에 메모리에 전체 파일이 필요하지 않습니다.파일을 메모리로 이동하지 않고 어떻게 루비로 작업 할 수 있습니까?

이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

+1

모듈로 나눌 수 있습니까? 여러 파일? – iouri

+2

예를 들어이 흥미로운 질문의 요점을 무시할 것이기 때문에 논쟁을 위해서, 아니오라고 가정하십시오. –

+3

예. 아무도 ** 파일 전체를 메모리로 읽어야한다고 말하지는 않습니다. 표준 스트리밍 (필요에 따라 입력/출력 만 가능), 무작위 액세스 (레코드 읽기) 및 mmap (표준 탐색 모델과 유사)이 있습니다. 물론 일부 작업 (예 : 전면에 추가 또는 삭제 - 더 복잡 할 수 있습니다. –

답변

3

다음은 큰 파일 정렬의 중간을 메모리에 전혀 읽지 않고 미세 조정하는 예입니다. 당신이 조금을 읽고 싶어하지만, 여러 상황에 IO.sysread.

TestFile = '/tmp/test' 
system "cp /usr/share/dict/words #{TestFile}; chmod +w #{TestFile}" 

File.open TestFile, 'r+' do |io| 
    io.sysseek 1000000 
    io.syswrite 'EASTER EGG!!!' 
end 
system "grep EASTER.EGG #{TestFile}" 

sysread 및 SYSWRITE가 유용한 참조 :

  • 을 당신은에 하나의 I/O 연산 또는 다양한 I/O 작전을하고있다 다른 장소 (버퍼링이 도움이되지 않습니다)
  • 당신은 큰 I/O 작전을 (버퍼링이 약간 느립니다)
  • 프로그램이 정교하거나 일반적으로 블록 지향하고있는 자체 버퍼링을하고있다
+0

감사합니다. 음, docs에서'# seek'과'# sysseek'의 차이점을 알 수는 없지만 ... 그것이 무엇인지 압니까? –

관련 문제