C#内存文件映射物理内存和虚拟缓存都上涨,换成固态硬盘存储,物理内存就没有上涨,但缓存还是不停的涨,直到16G(内存条大小),然后CPU使用率就开始变高,处理速度就成变慢趋势,C#内存文件映射如何解决内存和缓存上涨的问题?

解决方案 »

  1.   

           public virtual void Close()
            {
                if (m_pViewOfFile != IntPtr.Zero)
                {
                    WinAPI.UnmapViewOfFile(m_pViewOfFile);               
                    m_pViewOfFile = IntPtr.Zero;
                }
                if (m_hfilemap != 0)
                {
                    WinAPI.CloseHandle(m_hfilemap);                
                    m_hfilemap = 0;
                }
                if (m_hfile != WinAPI.INVALID_HANDLE_VALUE)
                {
                    WinAPI.CloseHandle(m_hfile);
                    m_hfile = WinAPI.INVALID_HANDLE_VALUE;
                }
                System.GC.Collect();
                System.GC.SuppressFinalize(this);
                if (Environment.OSVersion.Platform == PlatformID.Win32NT)
                {
                    Global_MB_Para.SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
                }
            }        protected bool CreateMapViewOfFile(Int64 dwFileOffset)
            {
                if (dwFileOffset < 0) return false;            Int64 n = dwFileOffset / PAGE_SIZE + 1;
                Int64 nViewOffset = (n - 1) * PAGE_SIZE;            if (nViewOffset > m_dwFileSize) return false;
                if (m_pViewOfFile != IntPtr.Zero)
                {
                    System.Web.Caching.Cache _cache = System.Web.HttpRuntime.Cache;
                    _cache.Remove(m_pViewOfFile.ToString());
                    WinAPI.UnmapViewOfFile(m_pViewOfFile);
                    m_pViewOfFile = IntPtr.Zero;
                }
                if (n * PAGE_SIZE > m_dwFileSize)
                {
                    if (!GrowFileMap()) return false;
                }
                m_pViewOfFile = WinAPI.MapViewOfFile(m_hfilemap,
                    WinAPI.FILE_MAP_WRITE,
                    HIDWORD(nViewOffset),
                    LODWORD(nViewOffset),
                    PAGE_SIZE);
                if (m_pViewOfFile == IntPtr.Zero) return false;
                m_dwViewCurrentPosition = (uint)(dwFileOffset - nViewOffset);
                m_dwViewOfMapOffset = nViewOffset;
                return true;
            }
      

  2.   


    public virtual void Close()
            {
                if (m_pViewOfFile != IntPtr.Zero)
                {
                    WinAPI.UnmapViewOfFile(m_pViewOfFile);               
                    m_pViewOfFile = IntPtr.Zero;
                }
                if (m_hfilemap != 0)
                {
                    WinAPI.CloseHandle(m_hfilemap);                
                    m_hfilemap = 0;
                }
                if (m_hfile != WinAPI.INVALID_HANDLE_VALUE)
                {
                    WinAPI.CloseHandle(m_hfile);
                    m_hfile = WinAPI.INVALID_HANDLE_VALUE;
                }
                System.GC.Collect();
                System.GC.SuppressFinalize(this);
                if (Environment.OSVersion.Platform == PlatformID.Win32NT)
                {
                    Global_MB_Para.SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
                }
            }        protected bool CreateMapViewOfFile(Int64 dwFileOffset)
            {
                if (dwFileOffset < 0) return false;            Int64 n = dwFileOffset / PAGE_SIZE + 1;
                Int64 nViewOffset = (n - 1) * PAGE_SIZE;            if (nViewOffset > m_dwFileSize) return false;
                if (m_pViewOfFile != IntPtr.Zero)
                {
                    System.Web.Caching.Cache _cache = System.Web.HttpRuntime.Cache;
                    _cache.Remove(m_pViewOfFile.ToString());
                    WinAPI.UnmapViewOfFile(m_pViewOfFile);
                    m_pViewOfFile = IntPtr.Zero;
                }
                if (n * PAGE_SIZE > m_dwFileSize)
                {
                    if (!GrowFileMap()) return false;
                }
                m_pViewOfFile = WinAPI.MapViewOfFile(m_hfilemap,
                    WinAPI.FILE_MAP_WRITE,
                    HIDWORD(nViewOffset),
                    LODWORD(nViewOffset),
                    PAGE_SIZE);
                if (m_pViewOfFile == IntPtr.Zero) return false;
                m_dwViewCurrentPosition = (uint)(dwFileOffset - nViewOffset);
                m_dwViewOfMapOffset = nViewOffset;
                return true;
            }
      

  3.   

    调用MapViewOfFile
    读取需要的数据
    调用UnmapViewOfFile
    这个操作必须是成对的
      

  4.   


    是成对的,主要是认为UnmapViewOfFile释放有延后,没及时释放又在循环新的申请
      

  5.   

    只要成对,那就不可能内存泄露
    UnmapViewOfFile直接调用的系统API,
    不会有类似GC的延后释放
    除非有异常出现导致
    释放未调用