内存映射文件创建方式的部分疑问
最近在用MemoryMappedFile 进行大文件操作研究,发现其CreateOrOpen、CreateFromFile两个创建方法出来的存取效率差别好大,测试源数据80M的Ascii栅格文件(5000*4000大小),读入后扩展了一倍的数据存储位置用于存储计算数据(直接理解为数据量翻倍),存贮的MemoryMappedFile 文件为320m。
测试结果:CreateOrOpen,创建耗时4s内,操作8s内,
CreateFromFile,读取耗时ms级忽略,操作20s左右
问题:1.有没有对MemoryMappedFile 有研究的,能说明下两个方法的主要区别?或者是效率差异的原因?
2.CreateFromFile方法有没办法优化存取速度?个人还是想优先使用该方法,毕竟超大文件可以直接打开,而不用每次创建初始。
相关创建的源码如下:
protected MemoryMappedFile m_objMemoryMapped
/// <summary>创建内存映射文件
/// </summary>
/// <param name="strMapName">内存映射文件名称</param>
/// <param name="objAccess">内存映射文件允许的访问类型</param>
/// <returns></returns>
public virtual bool Create(string strMapName, MemoryMappedFileAccess objAccess)
{
try
{
//创建内存映射文件
m_strMapName = strMapName;
if (p_MapPath + "" == "")
{
m_objMemoryMapped = MemoryMappedFile.CreateOrOpen(strMapName, m_nCapacity2, objAccess);
}
else
{
//判断是否存在
m_bIsExist = clsFile.IsExist_File(p_MapPath);
//创建
if (m_bIsExist)
{
m_objMemoryMapped = MemoryMappedFile.CreateFromFile(p_MapPath, FileMode.Open, strMapName, m_nCapacity2, objAccess);
}
else
{
m_objMemoryMapped = MemoryMappedFile.CreateFromFile(p_MapPath, FileMode.Create, strMapName, m_nCapacity2, objAccess);
}
}
//创建一个默认视图(避免视图为null)
m_objMapView = m_objMemoryMapped.CreateViewAccessor(0, m_nSize, objAccess);
return true;
}
catch
{
throw;
}
}