Как эффективно хранить и извлекать значения std :: vector <int>в файл - PullRequest
2 голосов
/ 07 июня 2019

У меня есть std::vector<int>, который состоит из значений -1,0,1. После некоторых первоначальных манипуляций с этими значениями я получаю вектор, в котором значения -1 можно опустить. Как эффективно хранить необходимые 0,1 значения в файле как в пространстве (более важно), так и во времени.

Кажется, есть 3 рекомендуемых варианта std::vector<bool>, std::bitset и boost::dynamic_bitset, но которые будут лучшими в этом случае. Я могу перебрать вектор и if value!=-1 добавить его в vector<bool> и затем сохранить его, но это лучший способ? Вектор содержит около 1 миллиона элементов (после манипуляции).

// Initialize temp_array of size n(obtained in runtime) with value -1
std::vector<int> temp_array(n, -1);
// Do some manipulation on the temp array
// Now temp array has values containing -1,0,1 of which all occurrences of -1 can be removed without worrying about the index
std::vector<bool>final_array;
for (const auto &i : temp_array)
    {
      if (i != -1)
      {
        final_array.push_back(i);
      }
    }
// How to store and retrieve this in the most space efficient way

Edit: Еще несколько подробностей о проблеме. Эффективность пространства является обязательным, потому что я храню сжатый формат матрицы смежности (выполняя некоторое пользовательское сжатие). Каждый узел может иметь до миллиона ребер (иногда даже больше), и таких узлов насчитывается около 10 миллионов (при работе с большими графами). Цель состоит в том, чтобы загрузить сжатую форму этого графа полностью в память и поддерживать базовые запросы без необходимости распаковывать и поддерживать край потоковой передачи (например, график живого журнала имеет 4847571 узел).

1 Ответ

3 голосов
/ 07 июня 2019

Если эффективность использования пространства является большой проблемой, и все, что у вас есть, это 0 и 1, то вы могли бы рассмотреть возможность хранения кодирования длины строки вашей двоичной строки.

Пожалуйста, смотрите, https://en.wikipedia.org/wiki/Run-length_encoding

В худшем случае, когда у вас чередуются 0 и 1.

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

...