繁体   English   中英

可以并且将C#写入对象到页面文件吗?

[英]Can and will C# write objects to the pagefile?

我想知道C#是否有可能将对象写入页面文件。

我已经知道.NET应用程序的虚拟机仅限于允许一个对象仅使用2 GB的ram,并且在此之前很久就会耗尽内存 - 即使在64位版本的Windows上也是如此。

但是我需要能够加载大量的字符串(不是一个大字符串而是许多小字符串)并且想知道是否可以加载它们并让它们被写入交换空间直到它们再次被需要(不幸的是它我无法阻止加载所有字符串,因为它是由调用我正在处理的代码的应用程序强制的。

为了原型,我试着看看下面的程序是否会耗尽内存(它会),即使它没有尝试分配一个巨大的字符串:

public static void Main()
{
        ICollection<StringBuilder> builders = new LinkedList<StringBuilder>();
        double used_ram = 2*1024*1024*1024L;
        int blocksize = 12800000;
        int blocks = (int) (used_ram/blocksize);
        for (int i = 1; i < blocks ; i++)
        {
            StringBuilder sb = new StringBuilder(blocksize/2);
            builders.Add(sb);
        }
        Console.ReadLine();
}

我希望将字符串写入交换空间,并想知道是否有任何方法可以强制应用程序执行此操作。

编辑:将交换文件的使用更改为页面文件(感谢您的澄清)。

好吧,这样可以增强我的问题:如果运行时的唯一限制是ONE对象不能分配超过2 GB的内存 - 为什么上面的代码内存不足 - 因为列表超过了2 GB的内存引用所有字符串构建器?

简答:不,你不能。

使用交换不是应用程序所做的事情:操作系统的内存管理系统负责。

如果您需要一次在进程中加载​​超过2GB的数据(并且根据需要不从每个块的磁盘检索数据),那么您就会遇到严重的设计问题。


编辑 :由于您已经在使用64位操作系统,请确保您正在为x64平台(或AnyCPU)编译应用程序,并且您的应用程序未使用WOW64作为32位进程运行。

我认为你的问题相当于:

32位.NET应用程序可以处理超过2GB的内存。

是的,可以通过调整分配给用户应用程序的内存与操作系统之间的分配来增加应用程序可以解决的内存量,但在大多数情况下我不建议它,因为它可能会导致细微而不是那么微妙的问题O / S功能,例如网络。 有关/3GB/USERVA交换机的详细信息,请参阅此文章 这将允许您的应用程序处理3GB(减去开销)的内存而不是2GB。

您可以使用的工具是:

  • 切换到64位.NET。
  • 使用内存映射文件。
  • 编写自己的分页系统。
  • 使用一些后备存储,例如文件系统,数据库。

您可以利用所有Windows内存管理功能并分配系统允许的内存,但您正在做的事情是某种类型的刷新到磁盘系统的尖叫。 即使你可以让Windows分配那么大的对象,你的表现也会很糟糕。 有许多开箱即用的系统(称为数据库),它允许您在其中放入大量数据并以非常短的顺序访问它们。

你可能做错了什么。 我编写了使用超过2 GB内存的.net应用程序。 如果您运行64位窗口,则没有理由您的应用程序不能使用更多内存。

我建议你应该编写自己的Cache-Class。 举个例子来看看这里

我认为在.Net应用程序级别上你的方法接近将是一个MemoryMappedFile

但这意味着应用程序不会尝试一次性获取所有字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM