2012-03-06 4 views
2

다음 상황에있는 C/C++ 혼합 프로젝트에서 작업하고 있습니다.응용 프로그램 계층 미리 가져 오기 시스템을 작성하는 방법

파일 하나 하나에 아주 작은 덩어리 (드물게 큰 덩어리도)를 통과하려면 반복이 필요합니다. 이상적으로, 나는 한 번 연속적으로 읽어야한다. 이 경우에는 버퍼에 큰 덩어리를 읽고 나중에 필요할 때 즉시 읽을 필요없이 나중에 소비하는 것이 더 나은 솔루션이라고 생각합니다.

문제는 캐시 크기의 균형을 조정하는 방법입니다. 내가 잘 활용할 수있는 잘 알려진 알고리즘/라이브러리가 있습니까?


업데이트 : 너희들 '답변에 대한

감사합니다 (제목 변경)와 나는 우리 상자에서 작업 캐싱 메커니즘의 다른 수준이 있습니다 이해합니다. 하지만 제 경우에는 충분하지 않습니다.

나는 여기서 중요한 무엇인가 놓쳤다 고 생각합니다. 사실 저는 엔진에 대한 읽기 요청이 너무 비싸서 기존 프레임 워크에 응용 프로그램을 구축하고 있습니다. (네, 엔진이 OS와 디스크 레벨 캐시를 이용한다고 믿습니다.) 그리고 제가하려는 것은 실제로 애플리케이션 레벨 프리 페칭 시스템을 만드는 것입니다.

생각하십니까?

+0

여기저기서 계속해서 읽지 않는 한 걱정할 가치가없는 것 같습니다. 디스크는 많은 양의 데이터를 캐시 할 수 있습니다. 나는 일반적으로 최대 64 MB를 생각하며 캐시에 요청한 것보다 더 많이 끌어 당깁니다. 그건 그렇고, 나는 섹터 분의 데이터 (아마 2 또는 4 KB)를 가져올 것을 제안 할 것이다. –

+1

최신 OS는 64MB가 아닌 모든 여유 메모리를 디스크 캐시로 사용합니다. – BatchyX

+0

아마 '디스크 버퍼'라고 말 했어야했는데, 드라이브에 내장 된 하드웨어를 언급하고있었습니다. –

답변

0

일반적으로 캐시를 두 번 만들 위험이 있으므로 자신의 캐시를 만드는 것이 아니라 OS가 제공하는 것을 사용하려고해야합니다. Linux의 경우 readahead()을 통해 OS 레벨 캐싱을 요청할 수 있습니다. 나는 윈도우가 무엇이 될지 모른다.

이 부분을 더 살펴보면 블록 레벨 (즉, 디스크) 매개 변수가 blockdev --setra을 통해 설정됩니다. (단지이 하나의 작업에만 전념하지 않는 한) 시스템에서 그것을 변경하는 것은 좋지 않을 것입니다. 그러나 그 값 (blockdev - getra)이 이미 일반적인 청크 크기보다 크면 수행 할 필요가 없을 수도 있습니다 다른 것.

[그리고 질문에 언급 된 다른 요점을 언급하기 위해 - OS는 여유 메모리에 파일 데이터를 캐시하지만, 읽지 않은 파일은 선취 적으로 읽지 않을 것입니다. 위의 요구 사항). 하지만 아무도 그렇지 않으면, 자세한 내용을 게시하십시오 ...]

+0

답변 해 주셔서 감사합니다. 하지만 OS 레벨 캐시는 충분하지 않습니다. 제 질문에 대한 내 업데이트를 참조하십시오. – Reinhard

+0

당신이 쫓아온 것과 같은 것입니다 - http://dl.acm.org/citation.cfm?id=1251047 ("pre-fetch memory management heuristic"을 검색하여 얻었습니다. "cache"가 있다고 생각합니다.) 여기를 돕지 않는). –

+0

고마워요! 이것에 대한 연구를하고 나중에 여기로 돌아올 것입니다. – Reinhard

0

read() 대신 파일 mmap() 시도 했습니까? 어떤 경우에는 이것이 더 효율적일 수 있으며 경우에 따라 그렇지 않을 수도 있습니다. 그러나 일반적으로 응용 프로그램보다 하드웨어에 대해 더 잘 알고 있기 때문에 시스템을 최적화하는 것이 가장 좋습니다. mmap()은 전체 파일이 필요하다는 것을 시스템에 알리므로 더 최적 일 수 있습니다.

+0

실제로 나는 독자적으로 파일을 읽지 않고있어, 당신을 오해하게해서 유감입니다. – Reinhard

+0

@Reinhard : 올바르게 이해하면 응용 프로그램에서 읽기를 프레임 워크로 발행하고 프레임 워크 자체가 시스템 수준의 데이터 액세스를 처리합니까? 이제는 시스템 자체가 아니라 프레임 워크에서 데이터를 캐시하는 더 나은 방법을 찾고 싶습니까? 이 경우 프레임 워크 자체에 크게 의존하기 때문에 질문에 대답 할 수 있다고 생각합니다. 프레임 워크를 작성한 사람들에게 직접 처리 할 수있는 좋은 방법을 직접 물어 보는 것이 좋습니다. – LiKao