2011-09-30 3 views
2

몇 가지 gb의 데이터를 메모리에 저장하는 방법을 찾고 있습니다. 데이터는 트리 구조로로드됩니다. 내 주요 기능을 통해이 데이터에 액세스 할 수 있기를 원하지만 프로그램을 실행할 때마다 트리에 데이터를 다시로드하는 데 관심이 없습니다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 데이터로드를위한 별도의 프로그램을 작성한 다음 주 기능에서 호출해야합니까? 아니면 더 나은 대안이 있습니까?엄청난 양의 데이터를 메모리에 저장하십시오.

감사 MADS

답변

6

내가 가장 좋은 대안이 데이터베이스를 사용하는 것입니다라고 말하고 싶지만 - 다음 "데이터를로드하기위한 별도의 프로그램"이 될 것입니다.

5

POSIX 호환 시스템을 사용하는 경우 mmap을 살펴보십시오.

Windows에는 파일을 메모리 맵핑하는 또 다른 기능이 있다고 생각합니다.

+1

:'를 mmap()'POSIX뿐만 ​​아니라 리눅스는 다음과 같습니다 http://pubs.opengroup.org/onlinepubs/009695399/functions/mmap.html – Raedwald

3

아마도 shared memory을 사용하여이 문제를 해결할 수 있습니다. 한 프로세스에서 트리를 빌드하고 주소를 노출하면 시작할 다른 프로세스가 쿼리 할 때 동일한 메모리를 확보 할 수 있습니다. 이 경우 여러 개의 동시 프로세스가 트리를 읽을 수 있는지 확인해야합니다. 읽기가 실제로 순수한 읽기 인 경우 충분히 쉽게 수행 할 수 있습니다.

+2

이. (또는 포인터 대신 색인을 사용하고 디스크의 매핑 된 파일에 트리를 저장하십시오). – Damon

+0

트리 구조에서 공유 메모리의 포인터 주소 지정에주의하십시오. 공유 메모리 내용은 상대 주소 지정을하므로 트리 포인터를 통해 이동하면 프로그램이 중단됩니다. Boost에는이 목적을위한 특별한 오프셋 포인터가 있습니다. –

0

4GB 이상의 메모리를 사용하려면 64 비트 시스템을 실행해야합니다. 트리를 빌드하고 전역 변수로 설정하면 프로그램의 모든 함수에서 트리와 데이터에 액세스 할 수 있습니다. 나는 아마 당신이 적은 메모리 소비를 요구하는 대체 방법을 시도하는 것이 좋습니다. 어떤 유형의 프로그램을 게시하고 어떤 유형의 트리를 게시하면 대체 방법을 찾는 데 도움을 줄 수 있습니다.

데이터를 계속 다시로드하고 싶지 않으므로 파일 저장 공간과 데이터베이스는 문제가되지 않지만 몇 가지 메모리는 엄청난 가격처럼 보입니다.

또한 Windows 시스템에서는 ReadProcessMemory()를 사용하여 다른 프로그램의 메모리에 액세스 할 수 있으므로 메모리 위치에 대한 포인터 만 있으면됩니다.

+0

두 개의 작은 메모 : 32 비트에서 매핑 할 수있는 것의 한계 Windows는 정상 부팅 (/ 3G 및 LARGEADDRESSAWARE 플래그가있는 2.3 ~ 2.4GB)에서 약 1.3 ~ 1.4GB가 아닌 4GB입니다. 또한, ReadProcessMemory는 memcpy (프로세스 간)의 일종이기 때문에 사용하기가 쉽지 않습니다. 오버 헤드는 금지되어 있습니다. – Damon

3

Memory mapped file이라는 기술을 조사해야합니다.

+0

+1은 가장 간단한 솔루션 중 하나이며, RAM보다 더 큰 데이터도 지원합니다. –

0

데이터 로더를 실행 가능 프로그램으로 구현하고 주 프로그램을 필요할 때로드 및 언로드하는 dll로 구현할 수 있습니다. 이렇게하면 데이터를 메모리에 보관하고 모든 데이터를 다시로드하거나 프로세스 간 메모리 공유를 수행하지 않고도 처리 코드를 수정할 수 있습니다.

또한 사전 처리없이 디스크에서 원시 데이터를 조작 할 수 있다면 (예 : 트리에 배치하고 내부에 대한 포인터 조작), 데이터를 메모리 맵핑하고 그것의 사용되지 않는 부분을로드하지 마십시오.

1

난 최선의 해결책은 캐시 서버를 구성하고 거기에 데이터를 넣는 것이라고 생각합니다. Ehcache

봐 :

으로 Ehcache는 성능을 향상 데이터베이스를 오프로드 및 확장 성을 단순화하는 데 사용되는 오픈 소스 표준 기반의 캐시입니다. Ehcache는 이며 성능이 뛰어나고 완벽한 기능을 갖추고 있으며 널리 사용되는 Java 기반 캐시 인 을 가장 많이 만들었습니다.

그것은 자바로 작성된,하지만 should support any language you choose :

캐시 서버가이 API를 가지고 편안하고 자원을 지향하고, SOAP를. 둘 다 모든 프로그래밍 언어로 클라이언트를 지원합니다. "당신이 리눅스를 사용하는 경우"

+0

오픈 소스 솔루션 +1. – Rob

관련 문제