Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Boost asio socket: самый быстрый способ прочитать файл с жесткого диска?

Автор вопроса: RellaОтветов: 3

Итак, я пробовал:

int buff_length = 8192;
ifstream stream;
char* buffer = new char[buff_length];

stream.open( path.string().c_str(), ios::binary );

boost::system::error_code ignored_error;

while (stream)
{
    stream.read(buffer, buff_length);
    boost::asio::write(*socket, boost::asio::buffer(buffer, stream.gcount()),
                            boost::asio::transfer_all(), ignored_error);
}

Интересно, как вы это делаете - как сделать это быстрее?

Мое приложение должно работать в Windows, Linux и Mac OS. Вот почему я часто использую boost. Я использую ab для тестирования. Я хочу получить в 2 или хотя бы 1,5 раза быстрее чтение и отправку файлов. Может быть, Boost::Iostream может мне как-то помочь?

  • Сколько файлов вы отправляете за раз (один за другим)? Какого размера ваши файлы обычно? John Zwinck 22.08.2011

c++filesocketsboostboost-asio

Ответы

Ответ 1 · рейтинг 2 · murrekatt

Не совсем уверен, что вам нужно, но чтобы ответить на ваш вопрос о быстром чтении файлов, вы можете сопоставить файл с памятью.

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

В Boost.Interprocess вы можете прочитать больше об этом здесь.

Ответ 2 · John Zwinck

Если вы пытаетесь оптимизировать отправку файла с диска через сокет, проверьте sendfile(2), если вы используете Linux. Он специально разработан для этой цели.

Если вы хотите придерживаться чего-то более похожего на то, что у вас есть сейчас, но настроить его, я бы попробовал сделать буфер небольшим количеством мегабайт, а не просто 8 КБ.

Ответ 3 · Simon

boost::asio уже обернул TransmitFile, см. следующий пример

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы