Dar*_*nda 6 c# memory memory-management
我正在将图像从高FPS相机传输到内存缓冲区(列表),并且由于这些图像非常大,因此计算机的内存耗尽非常快.
我想要做的是在应用程序内存不足之前停止传输一段时间.在我的测试过程中,我发现它与"Free Physical Memory"指标一致,接近于零.
现在的问题是我找不到以编程方式获取此值的方法; 在XP中,它甚至没有显示在任何地方(仅在Vista/7任务管理器中).

我已经尝试了所有可以找到的方法(WMI,性能计数器,MemoryStatus,......),但是我从中得到的只是"可用物理内存",当然不一样.
有任何想法吗?
更新 不幸的是,我需要数据在内存中(是的,我知道我不能保证它将在物理内存中,但仍然),因为数据是实时流式传输的,我需要在内存中预览它它被存储在那里.
相关性不是因果关系.即使物理内存仍然空闲,您也可以"耗尽内存" .物理记忆几乎肯定无关紧要; 你可能用完的是地址空间.
人们倾向于将"记忆"视为消耗芯片上的空间,但十多年来情况并非如此.现代操作系统中的内存通常被认为是一个大型磁盘文件,其上面有一个大硬件缓存以加快速度.物理内存只是基于磁盘的内存的性能优化.
如果你的物理内存不足,那么你的表现会很糟糕.但是稀缺的资源实际上是你正在耗尽的地址空间.一个大的列表必须有一个大的连续的地址空间块,并且可能没有任何块大到你想要的大小.
不要那样做.下拉一个合理大小的块,将其转储到磁盘,然后根据需要处理磁盘上的文件.
我迟到了,但您考虑过使用System.Runtime.MemoryFailPoint类吗?它做了很多事情来确保请求的分配成功,如果失败则抛出InsufficientMemoryException; 你可以抓住这个并停止转移.您可以预测传入帧的平均大小,并尝试分配3或4个帧,然后在发生故障时停止采集.也许是这样的?
const int AverageFrameSize = 10 * 1024 * 1024 // 10MB
void Image_OnAcquired(...)
{
try
{
var memoryCheck = new MemoryFailPoint(AverageFrameSize * 3);
}
catch (InsufficientMemoryException ex)
{
_camera.StopAcquisition();
StartWaitingForFreeMemory();
return;
}
// if you get here, there's enough memory for at least a few
// more frames
}
Run Code Online (Sandbox Code Playgroud)
我怀疑它是100%万无一失,但这是一个开始.由于其他答案中解释的原因,它肯定比性能计数器更可靠.