Как я могу построчно обрабатывать данные в буфере, не копируя данные? - PullRequest
0 голосов
/ 17 апреля 2020

В настоящее время я делаю что-то вроде этого:

void my_func(std::iostream &a_large_buffer) {
    std::vector<std::string> my_lines;
    for (std::string line; std::getline(a_large_buffer, line); ) 
    {
        // do stuff with line
        my_lines.emplace_back(line);
    }
    // ...
}

my_func обрабатывает вывод сетевого запроса, в результате чего a_large_buffer. Данные, которые я получаю, потенциально большие (несколько ГБ).

В настоящее время код обрабатывает данные в буфере, копируя их в строки, которые будут храниться в векторе. Процесс копирования увеличит использование памяти.

Как можно избежать этой ненужной копии ?

Альтернатива: Как удалить данные в части буфер, который я уже прочитал?

Я хотел бы «освободить» данные в буфере после их копирования в line. Или просто переместите его прямо от a_large_buffer до line.

Я не смог найти std::moveline. Есть ли такая вещь?

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

Быстрый пример:

Я думаю, что если я буду читать из буфера, содержимое в буфере все равно будет там. Я хотел бы изменить это и удалить все после прочтения. Я уверен, что есть способ для этого.

Поиграйте с примером здесь.

Обратите внимание, что в примере используется stringstream, а не iostream.

1 Ответ

0 голосов
/ 17 апреля 2020

my_lines.emplace_back(std::move(line));

...