Запросить предложение по использованию структуры данных - PullRequest
1 голос
/ 26 апреля 2011

Для каждого элемента в data1 мне нужно выяснить, какие элементы в data2 связаны с ним. Кроме того, для каждого элемента в data2 мне нужно выяснить, какие элементы в data1 связаны с ним. Поэтому я настраиваю взаимную структуру данных, как вы можете видеть ниже:

01  class data1 {
02    // class variables
03    int id;
04    float d1_v1;
05    float d1_v2;
06    map<string, float> m_to_data2; // string is the keyword of data2, float recorded the reference info when data1 and data2 are related.
07  };
08   
09  class data2 {
10    // class variables
11    int d2_v1;
      float d2_v2;
12    list <int> src_id;  // int is the id of data1
13  };
14   
15  map<string, data2 *> map_2;
16  map<int, data1 *> map_1;

Затем я анализирую файл и заполняю map_1 и map_2. Я нашел:

  1. общее использование памяти после настройки двух взаимосвязанных карт: 498,7M.

  2. без установки ссылки между данными2 на данные1 (без заполнения list <int> src_id), использование памяти: 392,7M.

  3. Без карты заполнения_1, без заполнения list <int> src_id в данных2, использование памяти: 182,0M

  4. Без заполнения map_1, заполните list <int> src_id идентификаторами данных1, использование памяти: 289,7M

  5. без карты заполнения m_to_data2, использование памяти: 290,0M

  6. Размер карты_1: 77737

  7. Размер карты_2: 1830009

  8. Размер map<string, float> m_to_data2 для каждого элемента map_1 в диапазоне 3 - 17522

  9. Размер list <int> src_id для каждого элемента map_2 в диапазоне 1-1377

Мне нужно уменьшить использование памяти после настройки взаимно связанных карт (в идеале менее 200M, в настоящее время 498M, как вы можете видеть выше). Я пытался разметить строку (ключевое слово data2) на int, установив дополнительный map <string, int>, поскольку int требует меньше памяти, чем string, но это может не сильно помочь, так как мне нужна дополнительная память для map <string, int>. Есть предложения?

Ваши комментарии / предложения высоко ценятся.

Ответы [ 3 ]

1 голос
/ 26 апреля 2011

Я бы начал со следующего:

  • Если возможно (т. Е. У вас есть повышение или tr1, а порядок не важен), измените все map с на unordered_map с.
  • Если возможно, измените list в data2 на vector.
  • Имейте unordered_map, который отображается с string на unsigned id и используйте его id везде, где вы в настоящее время используете строки. Учитывая размер диапазона 3-17k для m_to_data2, вы дублируете имена много .
0 голосов
/ 26 апреля 2011

Если я правильно понимаю ваш вопрос, я бы лучше использовал std :: multimap вместо std :: map

std::multimap<std::string, int> map2;
std::multimap<int, std::map<std::string, float> > map1;

, что сделало бы ваш код намного проще для понимания и перехода к оптимизации.

0 голосов
/ 26 апреля 2011

Похоже, что ссылочная переменная с плавающей запятой занимает слишком много памяти, возможно, вы можете изменить ее на unsigned int.

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