2011-04-22 2 views
0

매우 큰 파일 (예 :> 1GB)이 있고 그 중간에 하나의 문자를 추가하고 싶다고합니다. 전체 파일을 읽고 쓰지 않고도이 작업을 수행 할 수 있습니까? 나의 현재 솔루션 (의사 코드에서) 이것이다 :매우 큰 파일의 중간에 콘텐츠를 추가하거나 제거하는 빠른 방법이 있습니까

x = 0 
chunk = read 4KB chunk x of input file 
if chunkToEdit = x, chunk = addCharacter(chunk) 
append chunk to the output file 
x = x + 1 
repeat last 4 steps until input file is fully read 
delete input file 
move output file to input file 

이 작동하는 동안, 읽기 1GB의 결과, 단일 문자 변경할 수 있도록 작성 1기가바이트 또한 여분의 1GB 디스크 공간이 필요합니다. 필자가해야 할 일은 파일의 일부분을 수정하여 파일의 일부분 (예 : 4KB의 읽기 및 4KB의 쓰기)을 읽고 써야만합니다. 이것이 가능합니까 (아니면 제 해결책보다 나은 해결책입니까)?

파일을 조각화하고 변경된 부분에 대해 새 조각을 만드는 OS에서이 문제를 해결할 수 있다고 생각했지만이 기능이 작성되어 개발자에게 노출되었는지는 알 수 없습니다.

답변

1

아니요. 파일이 그런 식으로 작동하지 않습니다. 파일 크기를 변경해야하는 경우 수정 지점에서 끝까지 작동해야합니다.

삽입/삭제를 올바르게 처리 할 수는 있지만 사용자가 아닌 것처럼 들리는 파일 형식을 사용하고 있지 않는 한.

1

을 추가하면 중간에있는 한 문자는 반드시이 한 문자 뒤의 모든 문자를 한 문자 씩 이동해야합니다. 이것은 반드시 삽입 지점에서 파일의 끝까지 모든 것을 읽고 쓰도록 요구합니다. 이렇게 가능한 한 적은 메모리를 사용하는 방법이 될 것이다 : 파일

  • 1 개 문자 시프트 파일에 다시 쓰기 I = 0
  • 판독 마지막은 (i * N 바이트)

    • 내가
    • 는 단일 문자를 쓰기 삽입 지점에 도달 할 때까지
    • 반복 ++

    즉, n 바이트의 청크로 된 모든 내용을 파일 끝에서부터 삽입 점까지 거꾸로 한 문자 씩 이동시킨 다음 문자를 삽입하십시오. 문자를 삽입하려는 파일의 뒷부분이 멀수록 빠를 것입니다. 파일의 시작 부분에 자주 삽입하려는 경우이 방법이 최선의 해결책이 아닐 수 있습니다.

  • 관련 문제