2012-08-23 1 views
2

데이터베이스에서 많은 양의 데이터를 검색 할 때 C++ 응용 프로그램에 메모리가 부족한 경우가 있습니다. 32 비트 WinXP 시스템에서 실행되어야합니다. 파일을 개체로 바꿔 넣기

이 투명하게 (기존 코드의 대부분을) 디스크에 데이터 객체를 교환 요구에 의해서 만 메모리로 읽을 수 있는가, 그래서 나는 2GB의에 국한되지있어 Windows가에게주는 32 비트 그 방법?

나는 VirtualAllocAddress Window Extensions을 보았지만, 내가 원하는 것은 아닌지 확신한다.

는 또한 질문자가 파일 매핑을 만들고 거기에 개체를 만들려고 this SO question을 발견했다. 한 대답은 placement new을 사용하면 코드의 나머지 부분에 꽤 투명한 것처럼 들린다.

내 응용 프로그램이 실제 메모리가 부족하지 않게됩니까? 결국에는 여전히 32 비트 주소 공간 제한이 있기 때문에 완전히 확신 할 수 없습니다. 아니면 많은 종류의 객체를 만들 때 발생하는 다른 종류의 문제입니까? 32 비트 운영 체제를 사용하는 당신이 이것에 대해 할 수있는 아무것도 너무 오래

+0

창은이 유스 케이스에 대해 * 스왑 파일 *을 사용하지 않습니까? 그것은 천천히 지옥처럼 느껴지지만, 그것은 또한 당신의 해결책과 함께 할 것입니다. –

+3

@BartekBanachewicz : 스왑 파일도 일반적인 솔루션은 일반적인 32 비트 OS를 – PlasmaHH

+0

에 2/4기가바이트 가상 주소 공간 제한 * * 한 번에 모든 데이터를 검색 할 수 없습니다에 대해 아무것도 할 수 없습니다. 이미 데이터베이스에 있다면, 섹션에서 읽어보십시오. –

답변

1

. 가상 메모리에 실제로 3GB 이상 (Windows의 경우 2GB)의 데이터를 저장할 수있는 방법은 없습니다.

역사적으로 데이터베이스는 항상 읽기, 쓰기 및 검색을 사용하여이 문제를 처리했습니다. 따라서 메모리에서 직접 데이터에 액세스하는 대신 가짜 (64 비트) 포인터를 사용합니다. 데이터는 블록 (일반적으로 약 4kb)으로 분할되며 이러한 블록의 수는 메모리에 할당됩니다. 가짜 포인터 주소의 데이터에 액세스하려고 할 때 블록이 메모리에로드되어 있는지 확인하고 블록이 메모리에 액세스했는지 확인합니다. 그렇지 않은 경우 빈 슬롯을 찾아서 복사 한 다음 주소를 반환합니다. 사용 가능한 슬롯이없는 경우 데이터 조각이 디스크에 다시 쓰여지고 (수정 된 경우) 해당 슬롯이 다시 사용됩니다.

정말 멋진 점은 시스템에 충분한 RAM이있는 경우 운영 체제는 언제든지이 데이터 2GB 이상을 RAM에 캐시하고 실제로 읽고 쓰는 것 같은 느낌이들 때입니다. 디스크 운영 체제는 아마도 데이터를 메모리에 복사 할 것입니다. 물론 Linux 또는 Windows Server with PAE와 같은 3GB 이상의 실제 메모리를 지원하는 32 비트 운영 체제가 필요합니다.

SQLite는이 가지고있는 좋은 자체에 포함 된 implementation of this, 당신은 아마 약간의 노력으로의 사용을 만들 수 있습니다.

당신이 다음 유일한 대안이 작업을 수행하지 않으려면

64 비트 운영 체제를 사용하거나 또는 시간에 특정 시점에서 더 적은 데이터로 작업 할 수 있습니다.

+0

광범위한 답변을 보내 주셔서 감사합니다! – foraidt