2010-04-06 54 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; 

任何想法都欢迎。

亲切的问候阿尔曼。

编辑: RAM和核心数量不受限制。目前我有一个16Gb和8个核心。

更新

同样的问题,我是问在Boost.Users论坛上,我得到的回答来自华金中号洛佩斯·穆尼奥斯(Boost.MultiIndex的开发商)。 aswer是是的。可以使用Boost.Interprocess共享进程之间的multi_index。欲了解更多详情,请登录this link

+0

行动,您的链接指向的线程已被删除... – Pietro 2011-03-31 10:46:59

+0

@Pietro:这真的很奇怪:( – Arman 2011-03-31 10:56:36

回答

3

你看过Boost.Interprocess

+1

谢谢,这可能是如何做到这一点的方式。分享对象与Boost.Interporcess? 谢谢 – Arman 2010-04-06 10:57:11

+1

它需要编写一个自定义的分配器,虽然库可能会直接提出它(没有看过它一段时间)。但要小心,无论你使用什么策略(多线程或多进程),您将需要同步您的访问 – 2010-04-06 11:20:00

+0

为什么我应该关心访问读取?不同的进程可以并行读取多个索引。是不是? – Arman 2010-04-06 16:46:48

2

你有没有想过把它切成块。

并发访问很难。很难得到正确,难以维护,很难推理。

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

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

+0

数据包含2000个带有数据的文件,正在读取它们到内存,它是一个时间序列数据,multiindex非常适合旅行呃。你为什么认为10GB很大?我有一个16Gb Ram。我很想知道是否可以将数组的指针分享给另一个进程?另一个进程已经是多线程的,它运行在不同的ID上。我想摆脱大部分时间需要阅读的部分。 – Arman 2010-04-06 16:42:10

+0

我可能一直不清楚。占用10GB内存没有任何问题。只是假设你有太多的数据,如果你可以并行处理这些工作,处理它们可能会更容易一些,如果你可以削减数据以分块工作而不是实现同步机制,那么并行化会更容易。你说你有8个内核,如果你有8个内存块,每个内核都独立于其他内核进行处理,那么这8个内核是否正在处理数据而不是1个呢?那肯定会更快:) – 2010-04-07 06:14:13

+0

哦,是的,你说得对!这种方法是最快的。我有一个并行代码,它使用Boost.Threads来读取数据和几个分析工具(我会说模块)。目前的瓶颈是阅读,我想保持我的数据总是在内存中,并与许多线程分析。 – Arman 2010-04-07 07:14:55

相关问题