打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
用户对问题“使用双向fstream的rdbuf()
userphoto

2022.11.14 湖北

关注

我正在尝试使用Visual Studio 2019实现对大型文件的快速处理。应读取、处理数据,然后将其写入同一文件的末尾。在做了一些测试后,我发现在我的硬件上,1MB的文件缓冲区似乎是最好的选择。

在这里,我尝试将其设置为1MB:

#include <fstream>
#include <array>
#include <memory>

using namespace std;

int main()
{
    const streamsize BUFFER_SIZE = 1 * 1024 * 1024;
    unique_ptr<::array<char, BUFFER_SIZE>> buffer = make_unique<::array<char, BUFFER_SIZE>>();

    const streamsize FILE_BUFFER_SIZE = 1 * 1024 * 1024;
    unique_ptr<::array<char, FILE_BUFFER_SIZE>> file_buffer = make_unique<array<char, FILE_BUFFER_SIZE>>();

    ios::sync_with_stdio(false);

    fstream stream;
    stream.rdbuf()->pubsetbuf(file_buffer->data(), file_buffer->size());
    stream.open(R"(C:\test\test_file.bin)", ios::in | ios::out | ios::binary);

    while (stream.good())
    {
        stream.read(buffer->data(), buffer->size());

        // Some data processing and writes here
    }   
}

在使用Sysinternals的ProcessMonitor监视程序时,我可以看到WriteFile函数实际上是使用1MB缓冲区调用的,但ReadFile函数在一个循环迭代中被调用了256次,只有4K缓冲区。这会导致更差的性能。

我在谷歌上搜索了这个问题,没有发现类似的案例。如果能帮上忙我将不胜感激。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
输入输出
Protobuf C++ serialize到char*的方法
C++中的文件输入/输出(6):一些有用的函数
C++方式的文件操作(1)
c++文件操作详解
wcstombs
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服