4

約 10Gb の 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;

どんなアイデアでも大歓迎です。

よろしくアルマン。

編集: RAM とコアの数は制限されていません。現在、私は 16Gb と 8 コアを持っています。

アップデート

Boost.Users フォーラムで尋ねていたのと同じ質問で、Joaquín M López Muñoz (Boost.MultiIndex の開発者) から回答を得ました。答えははいです。Boost.Interprocess を使用して、プロセス間で multi_index を共有できます。詳細については、このリンクで確認できます

4

2 に答える 2

3

Boost.Interprocessを見たことがありますか?

于 2010-04-06T10:54:55.097 に答える
2

あなたはそれをバラバラに切ることを考えましたか。

同時アクセスは難しいです。正しく理解するのも、保守するのも、推論するのも難しい。

一方、10GB は非常に大きいので、データをクラスター化できないかと考えました。同じ構造を維持indexしますが、いくつかの条件 (ビッグ ID など) に応じて、10 個 (またはそれ以上) の独立したオブジェクトにディスパッチします。

このようにして、そもそも同時アクセスを処理する必要なく、各チャンクを他のチャンクとは別に自然に処理できます。

于 2010-04-06T11:21:54.267 に答える