2015-03-02 1 views
1

У меня есть некоторый код, который выглядит примерно так:Как отключить повышение :: iostreams буфера при чтении через фильтр цепь

boost::iostreams::filtering_istreambuf in; 
in.push(Lz4DecompressionFilter()); 
in.push(AesDecryptionFilter()); 
in.push(file_source("somefile")); 

У меня уже есть мета-данные, которые хранят длину результата:

std::vector<char> buf; 
buf.reserve(resultLength /* retrieved from a meta-data server */); 
std::streamsize ret = in.read(buf, buf.capacity); 

Добавив точки трассировки, я заметил, что фильтр Lz4 и Aes получает только чтение из 128 байтов. Кроме того, если я заменяю file_source на пользовательское устройство, он получает только чтение 4096 байт.

Поскольку я точно знаю размер, который должны иметь чтения, существует ли способ отключить буферизацию в iostreams целиком и просто сцепить считывание фильтра? Я знаю, что размеры буфера могут быть change, но я заинтересован в их полном отключении.

ответ

0
  • Стандартные потоки по определению используют абстракцию буфера. Это в значительной степени связано с тем, что некоторые из открытых функций требуют наличия буфера (peek/putback).

  • Как бы сжатие и шифрование все еще функционировали без буферизации? Комбинированные и блочные шифры требуют обработки (иногда даже фиксированного размера) кусков.

  • Re:

    Кроме того, если я заменю file_source с пользовательским устройством, он получает только считывает 4096 байт.

    Какое поведение вы ожидали бы вместо этого? Ожидаете ли вы бесконечного размера?

  • Использование блоков из> 4k очень необычно для потоковой обработки. В этом случае просто нужно просто скопировать все входные данные в один большой буфер (возможно, используя array_sink ...)?

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

+0

Я вижу вашу точку зрения. Дело в том, что фильтр AES и фильтр LZ4 имеют довольно сложные требования к буферизации, поэтому у них уже есть несколько буферов. Следовательно, все мои чтения уже выпущены с правильным размером (и расположением) буфера, и я не хочу, чтобы ускорение делалось дальше, ненужное копирование памяти. – user1202136

+0

Поэтому лучшим решением будет изменение размера буфера на источнике в соответствии с вашими потребностями. – sehe

+0

Я разделяю вашу заинтересованность в эффективности, и, по правде говоря, я мог бы рассмотреть возможность создания фильтра, который объединяет здесь шаги. В моем случае был задействован Boost Asio, поэтому я использовал предустановленные буферы с нулевой копией. По общему признанию, этот конкретный проект застрял в режиме прототипа: L – sehe

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