Boost Asio套接字:从硬盘读取文件的最快方式?

5

我尝试过:

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
3个回答

2
不太确定你需要什么,但是回答你关于快速读取文件的问题,你可以使用将文件映射到内存中的方法。
这样你就可以从内存中读取文件而不是从磁盘中读取了。根据文件大小等因素,可能会有不同的方法,例如:如果文件很小,则可以映射整个文件;如果文件很大,则可以在处理文件时映射文件的区域。
在Boost.Interprocess中,您可以在此处了解更多信息。

0
如果你想要优化的是从磁盘通过套接字发送文件,那么如果你使用的是Linux系统,可以尝试使用sendfile(2)。它是专门为此目的设计的。
如果你想继续使用现有的方法并进行调整,我建议将缓冲区设置为几兆字节而不仅仅是8KB。

1
sendfile 的 Windows 等效函数是 TransmitFile - Hasturkun
sendfile在MacOSX上可用吗? - Rella
@Kabumbus:是的,sendfile在OS X上可用:http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man2/sendfile.2.html - John Zwinck
太好了!那么如何使用它们与boost:socket? - Rella
调用 your_socket.native_handle() 以获取原始文件描述符,然后将其传递给 *nix 上的 sendfile,或者参见 @Simon 的链接,了解在 Windows 上使用 TransmitFile 的示例。 - John Zwinck

0

boost::asio已经封装了TransmitFile,可以参考以下示例


1
请注意,这个例子仅适用于Windows操作系统。 - Sam Miller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接