【问题标题】:Boost asio socket: fastest way to read file from hard drive?Boost asio socket:从硬盘读取文件的最快方法?
【发布时间】:2011-10-31 17:20:00
【问题描述】:

所以我试过了:

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 可以帮助我吗?

【问题讨论】:

  • 您一次发送多少个文件(一个接一个)?您的文件通常有多大?

标签: c++ file sockets boost boost-asio


【解决方案1】:

不完全确定您的目标是什么,但要回答有关快速读取文件的问题,您可以将文件映射到内存中

这样你从内存而不是从磁盘读取。根据文件大小等,可能会有不同的方法可能会很有趣,例如如果文件很小,则映射整个文件;如果文件很大,则在处理文件时映射整个文件的文件区域。

在 Boost.Interprocess 中,您可以阅读有关此here 的更多信息。

【讨论】:

    【解决方案2】:

    如果您尝试优化的是通过套接字从磁盘发送文件,如果您使用的是 Linux,请查看 sendfile(2)。它专为此目的而设计。

    如果您想坚持使用更像现在的东西,但要对其进行调整,我会尝试将缓冲区设置为少量兆字节,而不仅仅是 8 KB。

    【讨论】:

    • 相当于sendfile的Windows是TransmitFile
    • sendfile 在 MacOsX 上可用吗?
    • @Kabumbus:是的,sendfile 在 OS X 上可用:developer.apple.com/library/mac/#documentation/Darwin/Reference/…
    • grrate!)以及如何将 tham 与 boost:socket 一起使用?)
    • 调用 your_socket.native_handle() 以获取原始文件描述符,并将其传递给 *nix 上的 sendfile,或查看 @Simon 的链接,指向使用 TransmitFile for Windows 的示例。
    【解决方案3】:

    boost::asio 已经封装了 TransmitFile,见下面example

    【讨论】:

    • 请注意,此示例是特定于 Windows 的
    猜你喜欢
    • 2015-03-22
    • 2012-07-09
    • 2015-05-09
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    • 2015-01-13
    • 2011-04-18
    相关资源
    最近更新 更多