2010-04-06 7 views
4

나는 약 10Gb의 Boost.MultiIndex 큰 배열을 가지고있다. 독서를 줄이기 위해 나는 데이터를 메모리에 유지하는 방법이 있어야하고 다른 클라이언트 프로그램이 그것을 읽고 분석 할 수 있어야한다고 생각했다.Boost.MultiIndex : 두 프로세스간에 개체를 공유하는 방법이 있습니까?

구성 방법은 무엇입니까?

struct particleID 
    { 
    int   ID;// real ID for particle from Gadget2 file "ID" block 
    unsigned int IDf;// postition in the file 
    particleID(int id,const unsigned int idf):ID(id),IDf(idf){} 
    bool operator<(const particleID& p)const { return ID<p.ID;} 
    unsigned int getByGID()const {return (ID&0x0FFF);}; 

    }; 

struct ID{}; 
struct IDf{}; 
struct IDg{}; 

typedef multi_index_container< 
    particleID, 
    indexed_by< 
     ordered_unique< 
      tag<IDf>, BOOST_MULTI_INDEX_MEMBER(particleID,unsigned int,IDf)>, 
     ordered_non_unique< 
      tag<ID>,BOOST_MULTI_INDEX_MEMBER(particleID,int,ID)>, 
     ordered_non_unique< 
      tag<IDg>,BOOST_MULTI_INDEX_CONST_MEM_FUN(particleID,unsigned int,getByGID)> 
    > 
> particlesID_set; 

모든 아이디어를 환영합니다 : 같은

배열 보인다.

종류의 arman.

편집 : RAM 및 코어 수는 제한되지 않습니다. 현재 나는 16Gb와 8Core를 가지고있다.

업데이트

나는 호아킨 M 로페즈 무 노즈 (Boost.MultiIndex의 개발자)에서 대답을 얻었다 나는 Boost.Users 포럼에 묻는 것과 같은 질문입니다. aswer는 입니다. Boost.Interprocess를 사용하여 프로세스간에 multi_index를 공유 할 수 있습니다. 자세한 내용은에서 볼 수 있습니다 this link

+0

Ops, 링크가 가리키는 스레드가 삭제되었습니다 ... – Pietro

+0

@Pietro : 정말 이상합니다. ( – Arman

답변

3

Boost.Interprocess을 보았습니까?

+1

) 감사합니다.이 방법은 아마도 수행하는 방법 일 수 있습니다. Boost.Interporcess와 객체 공유하기 감사합니다. – Arman

+1

라이브러리가 직접 제안 할 수도 있지만 맞춤 할당 기 작성이 필요합니다 (잠시 보지 않았 음). 사용하는 전략이 무엇이든간에 (멀티 스레드 또는 다중 프로세스)를 사용하면 액세스를 동기화해야합니다. –

+0

액세스 읽기에 신경을 써야하는 이유 다른 프로세스가 다중 인덱스에서 병렬로 읽을 수 있습니다. 그렇지 않습니다. – Arman

2

조각으로 자르려고 생각 했습니까?

동시 액세스가 어렵습니다. 어려운 일, 유지하기 어려운 일, 추론하기 어려운 경우.

반면에 10GB는 매우 커서 데이터를 클러스터링 할 수 있는지 궁금합니다. 같은 index 구조를 유지하지만 일부 조건 (예 : 큰 ID)에 따라 10 개 (또는 그 이상)의 독립적 인 객체로 전달합니다.

이렇게하면 처음부터 동시 액세스를 처리 할 필요없이 자연스럽게 각 청크를 다른 프로세스와 별도로 처리 할 수 ​​있습니다.

+0

데이터에 데이터가 포함 된 2000 개의 파일이 포함되어 있습니다. 메모리에, 그것은 시계열 데이터, 멀티 인덱스는 잘 trave에 적합합니다 그것을 가져 가라. 왜 10GB가 크다고 생각하니? 나는 16Gb 램을 가지고있다. 배열의 포인터를 다른 프로세스와 공유하는 것이 가능한지 궁금합니다. 다른 프로세스는 이미 다중 스레드이며 다른 ID로 실행 중입니다. 나는 대부분의 시간이 걸리는 독서 부분을 없애고 싶다. – Arman

+0

내가 분명하지 않았을 수 있습니다. 10GB의 RAM을 차지하는 데는 아무런 문제가 없습니다. 데이터가 너무 많으므로 작업을 병렬화 할 수 있다면 처리하는 것이 더 쉬울 수 있으며 동기화 메커니즘을 구현하는 대신 청크로 작업하도록 데이터를자를 수 있다면 병렬화하는 것이 더 쉽습니다.당신은 8 개의 코어를 가지고 있다고 말하면, 8 개의 덩어리가 각각 독립적으로 처리되기 때문에 8 개의 코어가 단지 1 대신에 데이터를 처리하기 때문에 큰 것이 아니겠습니까? 그게 더 빠를 것입니다 :) –

+0

오, 그래, 맞아! 그 접근법이 가장 빠릅니다. Boost.Threads를 사용하여 데이터와 여러 분석 도구를 읽는 병렬 코드가 있습니다 (모듈이라고 말합니다). 현재 병목 현상은 읽기 작업이므로 내 데이터를 항상 메모리에 보관하고 많은 스레드로 분석하고 싶습니다. – Arman

관련 문제