C#内存文件映射物理内存和虚拟缓存都上涨的原因 C#内存文件映射物理内存和虚拟缓存都上涨,换成固态硬盘存储,物理内存就没有上涨,但缓存还是不停的涨,直到16G(内存条大小),然后CPU使用率就开始变高,处理速度就成变慢趋势,C#内存文件映射如何解决内存和缓存上涨的问题? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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; } 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; } 调用MapViewOfFile读取需要的数据调用UnmapViewOfFile这个操作必须是成对的 是成对的,主要是认为UnmapViewOfFile释放有延后,没及时释放又在循环新的申请 只要成对,那就不可能内存泄露UnmapViewOfFile直接调用的系统API,不会有类似GC的延后释放除非有异常出现导致释放未调用 帮忙看一下代码,急求!!! C# 数据比较 验证是否是货币类型 c# 远程控制 求助 请问如何使用comboBox帮定从数据库读出来的数据! 在DLL接口中,申明为ANSI的String如何取得返回值(传址) 请问哪里有视频教学资料下载?各种类型都可以 PNG图片生成 缩略图背景不透明,黑色背景,怎么做才能透明呢? 从表示层的datagrid更新了数据后,如何更新到数据库? 请教各位,初学c# C# listview 虚拟模式更新数据,不能实时刷新,需要点击一下才能更新一次 如何重载WORD方法??
{
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;
}
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;
}
读取需要的数据
调用UnmapViewOfFile
这个操作必须是成对的
是成对的,主要是认为UnmapViewOfFile释放有延后,没及时释放又在循环新的申请
UnmapViewOfFile直接调用的系统API,
不会有类似GC的延后释放
除非有异常出现导致
释放未调用