您好,欢迎来到客趣旅游网。
搜索
您的当前位置:首页c++ 内存映射高效写文件

c++ 内存映射高效写文件

来源:客趣旅游网


#include <assert.h>

#include <chrono>
#include <thread>
#include <iostream>
#include <fstream>
#include <windows.h>

#include <sys/stat.h>
#include <string.h>

#include <Windows.h>
#include <WinBase.h>

#define BAD_POS 0xFFFFFFFF // returned by SetFilePointer and GetFileSize
#define SUCCESS 0
using  namespace  std;


typedef  DWORD  mmf_share_mode;
typedef  DWORD  mmf_access_mode;
typedef  DWORD  mmf_flags;


LPCWSTR stringToLPCWSTR(string orig)
{
    size_t origsize = orig.length() + 1;
    const size_t newsize = 100;
    size_t convertedChars = 0;
    wchar_t* wcstring = new wchar_t[sizeof(wchar_t) * (orig.length() - 1)];
    mbstowcs_s(&convertedChars, wcstring, origsize, orig.c_str(), _TRUNCATE);
    return wcstring;
}

int  main()
{
    //    // 开始计时
    auto start = std::chrono::high_resolution_clock::now();
    int nnnn = 1024 * 1024 * 1024;
    char* write_chars = new char[nnnn];
    for (int i = 0; i < 10; i++)
    {
        char  file_name22[400] = { 0 };
        // 待映射的文件路径
        strcat(file_name22, std::to_string(i).c_str());
        strcat(file_name22, "test.dat");

        cout << "create memorymapfile..." << endl;
        const  char* shared_name = file_name22;
        //const  char* file_name = "d:\\testMmf.mmf";
        const  DWORD  mmf_size = nnnn;
        //存取模式
        mmf_access_mode access_mode = (GENERIC_READ | GENERIC_WRITE);
        //共享模式
        mmf_share_mode share_mode = FILE_SHARE_READ | FILE_SHARE_WRITE;
        //文件属性
        mmf_flags flags = FILE_FLAG_SEQUENTIAL_SCAN; //|FILE_FLAG_WRITE_THROUGH|FILE_FLAG_NO_BUFFERING;
        DWORD  error_code;

        //创建文件
        HANDLE  mmHandle =CreateFile(stringToLPCWSTR(file_name22),
                access_mode,
                share_mode,
                NULL,
                OPEN_ALWAYS,
                flags,
                NULL);

        if (mmHandle == INVALID_HANDLE_VALUE)
        {
            error_code = GetLastError();
            cout << "创建mmf失败:" << error_code << endl;
        }
        else
        {
            DWORD  high_size;
            DWORD  file_size = GetFileSize(mmHandle, &high_size);
            if (file_size == BAD_POS && (error_code = GetLastError()) != SUCCESS)
            {
                CloseHandle(mmHandle);
                cout << "error:" << error_code << endl;
            }
            cout << "create mmf sucessfully" << endl;

            //assert(file_size == 0);

            DWORD  size_high = 0;
            //创建文件映射,如果要创建内存页面文件的映射,第一个参数设置为INVALID_HANDLE_VALUE
            HANDLE  mmfm = CreateFileMapping(mmHandle,
                NULL,
                PAGE_READWRITE,
                size_high,
                mmf_size,
                stringToLPCWSTR(shared_name));

            error_code = GetLastError();
            if (SUCCESS != error_code)
            {
                cout << "createFileMapping error" << error_code << endl;
            }
            else
            {
                if (mmfm == NULL)
                {
                    if (mmHandle != INVALID_HANDLE_VALUE)
                    {
                        CloseHandle(mmHandle);
                    }
                }
                else
                {

                    size_t  view_size = mmf_size;
                    DWORD  view_access = FILE_MAP_ALL_ACCESS;

                    //获得映射视图
                    char* mmfm_base_address = (char*)MapViewOfFile(mmfm, view_access, 0, 0, view_size);
                    if (mmfm_base_address == NULL) {
                        error_code = GetLastError();
                        if (error_code != SUCCESS) {
                            cout << "error code " << error_code << endl;
                        }
                    }
                    else
                    {
                        memset(write_chars,i, mmf_size);
                        //char  write_chars[] = "hello chars";
                        //memcpy(write_chars, to_string(i).c_str(), mmf_size);
                        const  size_t  write_chars_size = mmf_size;
                        //向内存映射视图中写数据
                        CopyMemory((PVOID)mmfm_base_address, write_chars, write_chars_size);

                        //memcpy(mmfm_base_address,write_chars,write_chars_size);
                        
                        //size_t  position = 0;
                        //char  read_chars[write_chars_size];

                        读数据
                        //memcpy(read_chars, mmfm_base_address, write_chars_size);
                        //cout << "read chars " << read_chars << endl;

                        //卸载映射
                        UnmapViewOfFile(mmfm_base_address);
                        //关闭内存映射文件
                        CloseHandle(mmfm);
                        //关闭文件
                        CloseHandle(mmHandle);
                    }
                }
            }
        }
    }

    //    // 结束计时
    auto end = std::chrono::high_resolution_clock::now();

    // 计算持续时间
    std::chrono::duration<double> elapsed = end - start;

    // 输出结果
    std::cout << "Elapsed time: " << elapsed.count() << "s\n";

    system("pause");
    exit(0);
    return  EXIT_SUCCESS;
}

大家测试下,看看速度,回复下, 我的机子i7 10,固态,基本1G1秒

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- kqyc.cn 版权所有 赣ICP备2024042808号-2

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务