C# 如何限制每个线程的内存以避免CPU使用页面文件内存

C# 如何限制每个线程的内存以避免CPU使用页面文件内存,c#,multithreading,memory,C#,Multithreading,Memory,我想知道有没有办法限制每个线程的内存,这样当所有现有进程使用的内存超过可用RAM时,操作系统不会将虚拟地址空间移动到计算机的硬盘上,而是等待其他线程结束并释放内存,然后只启动另一个线程。这样做的原因是,当计算机开始使用页面文件时,它将大大降低整个进程的速度,并且运行速度甚至比单线程进程还要慢。在.Net应用程序中没有“每线程”内存限制,因为内存是从共享池(每个AppDomain)分配的 我还认为,对于本机进程没有这样的限制(基本上是出于相同的原因-系统通常不使用分配内存的线程标记内存)。在.Ne

我想知道有没有办法限制每个线程的内存,这样当所有现有进程使用的内存超过可用RAM时,操作系统不会将虚拟地址空间移动到计算机的硬盘上,而是等待其他线程结束并释放内存,然后只启动另一个线程。这样做的原因是,当计算机开始使用页面文件时,它将大大降低整个进程的速度,并且运行速度甚至比单线程进程还要慢。

在.Net应用程序中没有“每线程”内存限制,因为内存是从共享池(每个AppDomain)分配的

我还认为,对于本机进程没有这样的限制(基本上是出于相同的原因-系统通常不使用分配内存的线程标记内存)。

在.Net应用程序中没有“每个线程”内存限制,因为内存是从共享池(每个AppDomain)分配的


我还认为,对于本机进程没有这样的限制(基本上是出于同样的原因——系统通常不使用分配内存的线程标记内存)。

如果可能的话,您的要求将非常困难。您真正想解决的问题是什么?如果您不想使用页面文件,那么只需将页面文件大小设置为零即可。这在绝大多数情况下都是一个糟糕的想法,但是如果你真的想做的话,你可以做。嗨,我正在写一个地板细节应用程序。楼层数可能从一层到40层不等。我将为每个楼层生成楼层细节,然后将其保存到文件中。因为每个楼层的细节都是相互独立的,所以我可以通过并行处理利用所有的核心。我比较了并行处理和非并行处理的时间,但是我得到的是并行处理的时间比非并行处理的时间长。最后,我只发现这是由于现有进程超过了可用RAM,CPU开始写入页面文件的原因。(假设您测量了所有内容,发现页面错误性能计数器显示的值太高)-购买多一点RAM可能是最简单的解决方案(16GB成本低于100美元…)而不是试图寻找一些疯狂的限制……或者重新设计你的应用程序,使每个线程在处理其楼层之前必须从信号量获得一个“楼层令牌”,并在完成后返回。将信号量初始化为某个依赖于RAM的限制值。如果可能的话,您所要求的将非常困难。您真正想解决的问题是什么?如果您不想使用页面文件,那么只需将页面文件大小设置为零即可。这在绝大多数情况下都是一个糟糕的想法,但是如果你真的想做的话,你可以做。嗨,我正在写一个地板细节应用程序。楼层数可能从一层到40层不等。我将为每个楼层生成楼层细节,然后将其保存到文件中。因为每个楼层的细节都是相互独立的,所以我可以通过并行处理利用所有的核心。我比较了并行处理和非并行处理的时间,但是我得到的是并行处理的时间比非并行处理的时间长。最后,我只发现这是由于现有进程超过了可用RAM,CPU开始写入页面文件的原因。(假设您测量了所有内容,发现页面错误性能计数器显示的值太高)-购买多一点RAM可能是最简单的解决方案(16GB成本低于100美元…)而不是试图寻找一些疯狂的限制……或者重新设计你的应用程序,使每个线程在处理其楼层之前必须从信号量获得一个“楼层令牌”,并在完成后返回。将信号量初始化为某个依赖RAM的限制值。一个作业对象将允许您为一组进程设置内存限制。@JimMischel,通常可能有用。。。但绝对不是从原始问题的意义上来说,“限制进程内每个线程的内存使用量”比“限制一组进程的内存使用量”要精细得多。作业对象将允许您为一组进程设置内存限制。@JimMischel,可能在一般情况下很有用。。。但绝对不是从最初的问题“限制进程内每个线程的内存使用量”的意义上来说,它比“限制进程组的内存使用量”更细粒度。