boost :: multi_index_container — равные значения

Я пробовал несколько решений, используя библиотеку boost interprocess с картой и теперь multi_index_container в разделяемой памяти. С multi_index_container, есть ли другой способ, кроме как перебирать значения, возвращаемые равным. Я надеялся получить подмножество результатов из моего неуникального индекса (название станции, например, ST0012345), а затем найти / получить фактический тип измерения, который мне нужен (например, температура).

Мне нужно получить уникальное значение pointID для точки измерения (например, ST0012345SMD10000456.VoltsA = pointID — 45789), чтобы вставить значение измерения в исторический файл данных. Мне понравилась идея multi_index_container, так как полезная нагрузка нашего сообщения содержит ~ 100-200 измерений для одной станции в массиве, поэтому я подумал, что могу сделать один вызов в контейнер с общей памятью, который будет содержать более 500 000 элементов, а затем найти каждую точку измерения из намного меньший список с использованием длинного уникального имени строки.

Из прочитанного мною чтения может быть, что я могу только перебирать меньший список, возвращаемый из multi_index_container, а не выполнять get / find.

Если это так, то мне лучше придерживаться моего первоначального решения с картой совместно используемой памяти (которое я работаю), которое, как я уже сказал, содержит более 500 000 элементов длинных строк, с которыми можно сопоставить данные для получения pointID, требуемого нашим историком данных. Высокая скорость передачи данных — 200 точек, обрабатываемых в секунду (я обнаружил, что мой поиск по карте данных может достигать 2000 запросов в секунду в тестовой среде).

Кроме того, если я использую карту, будет ли вред иметь несколько карт в общей памяти, например, карта для станций в Сиднее (~ 300 000 пунктов), карта для станций в Ньюкасле (~ 200 000 пунктов).

Ниже приведен код моей программы, которая извлекает элементы из отдельного процесса, который создал multi_index_container.

using namespace boost::interprocess;
using namespace System;

namespace bmi = boost::multi_index;

typedef managed_shared_memory::allocator<char>::type              char_allocator;
typedef basic_string<char, std::char_traits<char>, char_allocator>shm_string;

struct tag
{
shm_string name;
shm_string stn;
shm_string mtype;
int         id;
tag( const char *name_
, const char_allocator &a
, const char *stn_
, const char_allocator &b
, const char *mtype_
, const char_allocator &d
, int id_)
: name(name_, a),
stn(stn_, b),
mtype(mtype_, d),
id(id_)
{}
};

struct name{};
struct stn{};
struct mtype{};
struct id{};

typedef bmi::multi_index_container<
tag,
bmi::indexed_by<
bmi::ordered_unique
<bmi::tag<name>,  BOOST_MULTI_INDEX_MEMBER(tag,shm_string,name)>,
bmi::ordered_non_unique<
bmi::tag<stn>,BOOST_MULTI_INDEX_MEMBER(tag,shm_string,stn)> >,
managed_shared_memory::allocator<tag>::type
> tag_set;typedef tag_set::iterator iterator;int main(array<System::String ^> ^args)
{
try{

managed_shared_memory segment(open_only,"MySharedMemory");

offset_ptr<tag_set> es = segment.find<tag_set>("My MultiIndex Container").first;

char_allocator alloc_inst(segment.get_allocator<char>());
shm_string  key_object(alloc_inst);
key_object = "ST0012345SMD10000456";

std::pair<tag_set::index<stn>::type::iterator, tag_set::index<stn>::type::iterator> values = es->get<stn>().equal_range(key_object);
while(values.first != values.second) {
std::cout << values.first->name << " -- " <<"  ("<<values.first->stn<<","<<values.first->mtype<<")\n";
++values.first;
}char_allocator alloc_inst2(segment.get_allocator<char>());
shm_string  key_object2(alloc_inst2);
key_object2 = "ST0012345SMD10000456.VoltsA";

///// is there any way something like the following can be done rather than the above iterator ?????
iterator it = values->get<name>(key_object2);  <-------  ????????????????????????
}
catch(const std::exception &exc){
std::cerr << "Exception caught: " << exc.what();
throw;
}
Sleep(3000);
return 0;

}

0

Решение

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector