逆序存储文件(三)——文件内存映射

本文探讨了对于大文件逆序存储,传统方法在面对几M到几G文件时性能不足的问题。文章介绍了使用内存映射技术,通过创建文件句柄、映射对象句柄、映射到进程地址空间、操作、解除映射和关闭资源来实现文件操作,以提高读写性能。实验结果显示,内存映射方法在处理17M文本文件时的性能远超其他方法。需要注意的是,对内存映射原理的理解需要加强,并根据文件大小调整映射策略。
摘要由CSDN通过智能技术生成

        之前介绍的两种逆序存储文件的方法,由于性能问题,只适用于小文件的操作,如果源文件较大,几M,几百M,甚至几G,则需要使用文件内存映射的方式。我对内存映射的原理认识不深,也未做研究,我只知道,使用内存映射将文件映射到内存后,就可以直接通过操作映射的内存块来操作磁盘中的文件,避免了我们主动调用磁盘I/O(I/O过程被操作系统接管),从而提高了文件读写性能。

        文件内存映射的过程是:创建文件句柄(CreateFile)->创建文件映射对象句柄(CreateFileMapping)->将文件映射到进程地址空间(MapViewOfFile)->操作->解除映射内存(UnmapViewOfFile)->关闭资源句柄(CloseHandle),实例代码如下(逆序存储):

 

//FileMapping.h
#pragma once
#include <Windows.h>
#include <tchar.h>


class FileMapping
{
public:
	FileMapping();
	~FileMapping();

	void SetSrcFile(TCHAR* pSrcFile);
	void SetDestFile(TCHAR* pDestFile);

	bool DoTransfer();
private:
	bool InitSrcFileMapping();
	bool InitDestFileMapping();
	void UninitSrcFileMapping();
	void UninitDestFileMapping();
	bool ReverseCopy()const;
	bool IsEnCharacter(const char* pCh)const
	{
		if(!pCh) return false;
		return !(*pCh & 0x00000080);
	}

	TCHAR* m_pSrcFile;
	TCHAR* m_pDestFile;

	bool m_bInitSrc;
	HANDLE m_hSrcFile;
	HANDLE m_hSrcFileMapping;
	char* m_pStartSrcBlock;
	DWORD m_dwSrcBlock;

	bool m_bInitDest;
	HANDLE m_hDestFile;
	HANDLE m_hDestFileMapping;
	char* m_pStartDestBlock;

};

 

//FileMapping.cpp

#include "FileMapping.h"
#in
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值