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

发布于 2024-11-30 23:08:16 字数 597 浏览 0 评论 0原文

所以我尝试过:

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 操作系统上运行。这就是我大量使用 boost 的原因。我使用 ab 进行测试。我希望读取和发送文件的速度提高 2 倍或至少 1.5 倍。 Boost::Iostream 可以帮助我吗?

So I have tried:

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);  
}

I wonder how you do it - how to do it faster?

My app shall work across Windows, linux and mac os. That is why I use boost alot. I use ab for testing. I want to get 2 or at least 1.5 times faster on reading and sending files. May be Boost::Iostream can help me any how?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

朦胧时间 2024-12-07 23:08:16

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

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

在 Boost.Interprocess 中,您可以阅读有关此内容的更多信息 这里

Not entirely sure what you're after, but to answer your question about fast reading of files you can map the file into memory.

This way you read from the memory instead of from disk. Depending on the file size and such there are different approaches that might be interesting, e.g. map whole file if small or map regions of file throughout the file as you process it if it's a large file.

In Boost.Interprocess you can read more about this here.

酒儿 2024-12-07 23:08:16

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

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

If what you're trying to optimize is sending a file from disk across a socket, check out sendfile(2) if you're on Linux. It is specifically designed for this purpose.

If you want to stick with something more like what you have now, but tune it, I'd try making the buffer be a small number of megabytes rather than just 8 KB.

温馨耳语 2024-12-07 23:08:16

boost::asio 已经包装了 TransmitFile,请参阅以下 示例

boost::asio has already wrapped TransmitFile, see the following example

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文