2010-04-06 4 views
4

У меня есть Boost.MultiIndex большой массив около 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; 

Любые идеи приветствуются.

вид сэр Arman.

EDIT: ОЗУ и количество ядер не ограничены. В настоящее время у меня есть 16Gb и 8cores.

Update

Тот же вопрос я задавал в Boost.Users форуме я получил ответ от Хоакина M Лопеса Муньоса (разработчик Boost.MultiIndex). Aswer is Да. Можно разделить multi_index между процессами с помощью Boost.Interprocess. Более подробную информацию вы можете найти в: this link

+0

Ops, поток, на который вы ссылались, был удален ... – Pietro

+0

@Pietro: Это действительно странно :( – Arman

ответ

3

Вы посмотрели Boost.Interprocess?

+1

Спасибо, это, наверное, способ, как это сделать. делят объект с Boost.Interporcess? спасибо. – Arman

+1

Для этого потребуется написать пользовательский распределитель, хотя библиотека может предложить его напрямую (не смотрел на него некоторое время). Остерегайтесь, что какая бы стратегия вы ни использовали (несколько потоков или несколько процессов), вы должны синхронизировать свои обращения. –

+0

Почему я должен заботиться о чтении доступа? Различные процессы могут считываться из multindex в параллель. Не так ли? – Arman

2

Вы подумывали обрезать его на куски.

Параллельный доступ затруднен. Трудно получить право, трудно поддерживать, трудно рассуждать.

С другой стороны, 10 ГБ очень большой, и я задавался вопросом, можете ли вы сгруппировать свои данные. Сохраняйте ту же структуру index, но отправляйте ее в 10 (или более) независимых объектов в зависимости от некоторых условий (например, большой id).

Таким образом, вы, естественно, можете обрабатывать каждый кусок отдельно от другого без необходимости иметь дело с одновременным доступом в первую очередь.

+0

Данные содержат 2000 файлов с данными, я читаю их в в память, это данные временных рядов, мультииндекс хорошо подходит для обучения Это так. Почему вы думаете, что 10 ГБ являются большими? У меня 16 ГБ. Мне было интересно, возможно ли передать указатель массива только другому процессу? Другой процесс уже многопоточен, он работает с разными идентификаторами. Я хотел бы избавиться от читающей части, которая занимает большую часть времени. – Arman

+0

Возможно, я был неясен. Нет ничего плохого в том, чтобы заняться 10 ГБ оперативной памяти. Просто, учитывая, что у вас так много данных, их можно было бы легко обработать, если бы вы могли распараллелить работу, и проще распараллелить, если вы можете сократить данные для работы в кусках, а не внедрять механизм синхронизации.Вы говорите, что у вас 8 ядер, так что было бы здорово, если бы у вас было 8 кусков, каждый из которых обрабатывался независимо от других, так что 8 ядер хрустят данные вместо 1? Это было бы быстрее: –

+0

О, да, вы правы! Этот подход самый быстрый. У меня есть параллельный код, который использует Boost.Threads для чтения данных и нескольких инструментов анализа (я бы сказал, модулей). В настоящее время узким местом является чтение, я хотел бы всегда хранить свои данные в памяти и анализировать многие темы. – Arman

Смежные вопросы

 Смежные вопросы