2012-11-26 4 views
0

매우 큰 색인 파일이있는 곳에서 프로그램을 만들어야하는데 파일에서 데이터를 검색하고 해석해야합니다. 이제 캐치는 필자가 찾고있는 것이 아닌 경우 특정 데이터를 캐시에서 제거해야하므로 (인수로 결정된) 언제든지 캐시 된 파일의 x 바이트 만 허용 할 수 있습니다.C가 파일의 일부를 캐시에 읽어들입니다.

필자의 이해가 정확하다면 fopen (r)은 캐시에 아무 것도 넣지 않고 getc 나 fread (크기 지정)를 호출 할 때만 캐시됩니다.

제 질문은 fread를 사용하고 100 바이트를 읽지 만 100 바이트 중 20 개만 필요한 데이터를 포함한다는 것입니다. 파일에서 더 많은 것을 읽으려면 캐시에서 쓸모없는 80 바이트를 제거 (또는 덮어 쓰기)하면 어떻게 될까요? 문제 쉽게

+0

나는 다소 혼란 스럽다고 생각합니다. 이 경우 "캐시"가 의미하는 바를 자세히 설명해 주시겠습니까? O/S 캐시 또는 다른 것을 언급하고 있습니까? –

답변

2

fread의 첫번째 인수 I하게 메모리에 저장된 데이터를 평균 캐싱함으로써

EDIT 메모리 블록을 가리키는 포인터이다. 그래서 이것에 관해가는 길은 당신이 쓰려고하는 것들에 대한 포인터를 설정하는 것입니다. 예를 들어 20-40 바이트를 유지하고 나머지는 모두 덮어 쓰고 싶다고 가정 해 보겠습니다. a) 길이가 20 인 시작에서 fread을 호출 한 다음 크기가 60 인 buffer[40]에서 다시 호출하십시오. b) 조각 모음을 수행하여 시작할 수 있습니다 (예 : 계속 유지할 바이트를 복사). fread 다음 섹션에 대한 포인터가 있습니다.

-1

fopen()으로 연 파일의 읽기 버퍼를 삭제하려면 fflush()를 사용할 수 있습니다. 또한 setvbuf()를 사용하여 버퍼 크기를 제어 할 수 있습니다.

버퍼링을 정확하게 제어해야하는 경우에는 열기/읽기 (fopen/fread 대신)를 사용해야합니다.

+0

setvbuf는 C 라이브러리가 수행하는 스트림 버퍼링을위한 것입니다. Simiarly, fflush * only *는 해당 버퍼에서 작동합니다. 그들은 O/S가 구현 한 캐시와 아무런 관련이 없습니다. –

+0

예, 표준 C 라이브러리는 항상 버퍼링합니다 (기본 버퍼 크기는 BUFSIZ 임). 그가 버퍼링을 제어하고 싶다면, 그렇게하는 것이 좋습니다. –

+0

그는 캐시에 대해 말했지만 이론적으로는 C 표준 라이브러리에 의해 유지되는 버퍼를 의미한다고 생각합니다. –

2

왜 캐시를 미세 조정 하시겠습니까? 둘째로, 당신은 무엇을 당신이 할 수 있다고 생각하게합니까? 프로그램의 명령 줄에 지정된 인수는 캐시 관리자가 내부적으로 수행하는 작업을 제어 할 수 없습니다. 전체 파일을 RAM으로 읽거나, 아무 것도 읽지 않기로 결정할 수도 있고, 파티를 개최하기로 결정할 수도 있습니다. 여러분이 가지고있는 모든 컨트롤은 저수준 API/syscall을 사용할 것이고 매우 세분화되지는 않을 것입니다.

+0

그것은 교수가 과제에 대한 요구 사항 중 하나 인 이유입니다.캐시의 모든 부분이 메모리를 예측할 수있는 한 알아 차리지 못한다고 생각했기 때문에 바보 같다고 생각합니다. –

+1

교수님에게 돌아가서 캐시의 의미를 정확히 물어볼 필요가 있습니다. 케이스. 솔직히, 그가 O/S 캐시를 마이크로 관리하기를 원한다면 그는 바보입니다. 그리고 내가 그렇게 말한 것을 자유롭게 느낄 수 있습니다. –

+0

지시 사항을 더 신중하게 다시 읽은 후에는 메모리에로드 된 데이터가 제약 조건에 해당합니다. 단지 캐싱이라고 말하면서 혼동이 발생했다고 생각합니다. 내 실수는 –

1

당신이 요구 사항에 대해 혼란 스러울 수도 있고, 아니면 당신에게 준 사람 일 수도 있습니다. 당신은 운영 체제가 관리하는 캐시를 언급하고있는 것처럼 보이므로 응용 프로그램이 걱정할 필요가 없습니다. 운영 체제가 자동으로 커지지 않도록합니다.

"캐시"의 다른 의미는 사용자가 직접 만든 버퍼 또는 버퍼를 처리하는 동안 메모리에 데이터를 임시로 보관하기 위해 사용자가 생성 한 것입니다. 이것은 버퍼에 너무 많은 메모리를 할당하지 않음으로써 간단히 관리 할 수 ​​있어야합니다.

관련 문제