限制使用RAM.(C#.NET)

Jea*_*uis 2 c# ram limiting

有大约100Mb的巨大文件.我想将它们加载到内存(RAM)中,处理并保存在某处.

同时我希望存在内存使用限制.例如,100Mb,到我的应用程序不要使用更多的内存限制.如果超出限制,则文件处理部件.

我对此的理解:

var line = file.ReadLine();
var allowed = true;

while( allowed && line != null ) 
{
   var newObject = new SomeObject( line );
   list.add( newObject );

   // Checking the memory
   allowed = CheckUsedMemory(); 

   line = file.ReadLine()
} 
Run Code Online (Sandbox Code Playgroud)

如何限制RAM的使用?如何实现CheckUsedMemory方法?谢谢.

UPD

谢谢大家的好意见.

sar*_*old 6

首先,感谢您了解您的内存消耗。要是有更多的程序员这么体贴就好了..

其次,我不会打扰:也许用户希望您的应用程序运行得尽可能快,并且愿意消耗 8000 兆内存以将结果提高 5%。让他们。:)

但是,人为地限制应用程序占用的内存量可能会大大增加处理时间,如果您在此过程中强制进行更多的磁盘访问。如果有人在内存受限的系统上运行,他们很可能已经有用于交换的磁盘流量——如果你在真正完成之前人为地转储内存,你只会进一步促进磁盘 IO,进入交换的方式。让操作系统处理这种情况。

最后,您在此处编写的访问模式(顺序、一次一行)非常常见,毫无疑问,.NET 设计人员已投入大量精力将这种模式的内存使用量降至最低。将对象分部分添加到内部树中是一个不错的主意,但很少有应用程序可以真正从中受益。(合并排序是一种出色的应用程序,它从部分处理中受益匪浅。)

根据您对完成的对象列表所做的工作,您可能无法立即改进整个列表。或者,您可能会从分解它中受益匪浅。(如果Map Reduce很好地描述了您的数据处理问题,那么您可能会从拆分中受益。)

无论如何,我对使用“内存”作为决定何时拆分处理的基准持谨慎态度:我宁愿使用“1000 行输入”或“十级嵌套”或“运行机床”五分钟”或基于输入的东西,而不是消耗内存的次要效果。


xan*_*tos 5

您可以尝试:

long usedMemory = GC.GetTotalMemory(true);
Run Code Online (Sandbox Code Playgroud)

要么

long usedMemory = GC.GetTotalMemory(false);
Run Code Online (Sandbox Code Playgroud)

第一个会强制收集(清理)内存,因此速度较慢(毫秒)

然后阅读此内容以查看您的机器有多少内存:

你如何获得计算机的RAM总量?

请记住,如果您作为32位应用程序运行,则无法使用所有内存,而其他进程可能正在使用内存!