Boost.MultiIndex:有没有办法在两个进程之间共享对象?

Posted

技术标签:

【中文标题】Boost.MultiIndex:有没有办法在两个进程之间共享对象?【英文标题】:Boost.MultiIndex: Are there way to share object between two processes? 【发布时间】:2010-04-06 10:52:48 【问题描述】:

我有一个大约 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。更多详情请见this link

【问题讨论】:

Ops,您的链接指向的话题已被删除... @Pietro: 真的很奇怪:( 【参考方案1】:

你看过Boost.Interprocess吗?

【讨论】:

谢谢,这可能是一种方法。您能否发布一个如何与 Boost.Interporcess 共享对象的示例?谢谢。 这将需要编写一个自定义分配器,尽管库可能会直接提出它(有一段时间没看)。请注意,无论您使用哪种策略(多线程或多进程),您都必须同步访问。 为什么我应该关心访问阅读?不同的进程可以并行读取multiindex,不是吗?【参考方案2】:

你有没有想过把它切成碎片。

并发访问很困难。难以正确、难以维护、难以推理。

另一方面,10GB 非常大,我想知道您是否可以对数据进行集群。保持相同的 index 结构,但根据某些条件(例如大 id)将其分派到 10 个(或更多)独立对象中。

通过这种方式,您可以自然地独立处理每个块,而不必首先处理并发访问。

【讨论】:

数据包含 2000 个文件和数据,我正在将它们读入内存,它是一个时间序列数据,多索引非常适合遍历它。为什么你认为 10GB 很大?我有一个 16Gb 内存。我想知道是否可以将数组的指针共享给另一个进程?另一个进程已经是多线程的,它在不同的 ID 上运行。我想摆脱大部分时间的阅读部分。 我可能不清楚。占用 10GB 的 RAM 没有错。只是考虑到你有这么多数据,如果你可以并行化工作,处理它们可能会更容易,如果你可以将数据切割成块而不是实现同步机制,那么并行化会更容易。你说你有 8 个核心,那么如果你有 8 个块,每个块都独立于其他块进行处理,这样 8 个核心正在处理数据而不是 1 个,那不是很好吗?那肯定会更快:) 哦,是的,你是对的!这种方法是最快的。我有一个并行代码,它使用 Boost.Threads 来读取数据和几个分析工具(我会说模块)。目前的瓶颈是读取,我想将我的数据始终保存在内存中并使用多个线程进行分析。

以上是关于Boost.MultiIndex:有没有办法在两个进程之间共享对象?的主要内容,如果未能解决你的问题,请参考以下文章

Boost.MultiIndex 模板替换失败?

Boost Multiindex:示例在 cpp 文件中编译,但不在标头中

有没有办法在java中同时运行两个GUI

有没有办法实现两个tableview的并行滚动?

有没有办法在 XAMPP 中使用两个 PHP 版本?

有没有办法在 xib 中用两个标签(固定比例宽度)填充集合单元格?