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

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

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 может мне как-то помочь?


person Rella    schedule 21.08.2011    source источник
comment
Сколько файлов вы отправляете за раз (один за другим)? Какого размера ваши файлы обычно?   -  person John Zwinck    schedule 22.08.2011


Ответы (3)


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

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

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

person murrekatt    schedule 22.08.2011

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

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

person John Zwinck    schedule 21.08.2011
comment
Эквивалент sendfile для Windows: TransmitFile - person Hasturkun; 22.08.2011
comment
Доступен ли файл sendfile для MacOsX? - person Rella; 22.08.2011
comment
@Kabumbus: да, файл отправки доступен в OS X: developer.apple.com/library/mac/#documentation/Darwin/Reference/ - person John Zwinck; 22.08.2011
comment
grrate!) И как использовать tham с boost:socket?) - person Rella; 23.08.2011
comment
Вызовите your_socket.native_handle(), чтобы получить необработанный дескриптор файла, и передайте его в sendfile на *nix или см. ссылку @Simon на пример с использованием TransmitFile для Windows. - person John Zwinck; 24.08.2011

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

person Simon    schedule 22.08.2011
comment
Обратите внимание, что этот пример специфичен для Windows. - person Sam Miller; 22.08.2011