Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#是否可以将对象写入页面文件?_C#_Memory Management_Out Of Memory - Fatal编程技术网

C#是否可以将对象写入页面文件?

C#是否可以将对象写入页面文件?,c#,memory-management,out-of-memory,C#,Memory Management,Out Of Memory,我想知道C是否可以将对象写入页面文件 我已经知道,一个.NET应用程序的虚拟机被限制为只允许一个对象使用2GB的ram,并且在此之前很久就会耗尽内存,即使在64位版本的Windows上也是如此 但是,我需要能够加载大量字符串(不是一个大字符串,而是许多小字符串),我想知道是否可以加载它们并让它们写入交换空间,直到再次需要它们(不幸的是,我无法阻止加载所有字符串,因为它是由调用我正在处理的代码的应用程序强制加载的) 为了使它成为原型,我试着看看下面的程序是否也会耗尽内存(它会这样做),即使它不尝试

我想知道C是否可以将对象写入页面文件

我已经知道,一个.NET应用程序的虚拟机被限制为只允许一个对象使用2GB的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();
}
publicstaticvoidmain()
{
ICollection builders=新建LinkedList();
双用ram=2*1024*1024*1024L;
int blocksize=12800000;
int块=(int)(使用的内存/块大小);
对于(int i=1;i
我希望字符串会被写入交换空间,我想知道是否有任何方法可以强制应用程序这样做

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


好的,让我来补充一下我的问题:如果运行时的唯一限制是一个对象不能分配超过2GB的内存-为什么上面的代码会耗尽内存-因为列表通过引用所有字符串生成器超过2GB的内存?

您可以利用所有windows内存管理功能和尽可能多地分配系统允许的内存,但您所做的工作需要某种类型的磁盘刷新系统。即使您可以让windows分配这么大的对象,您的性能也会很差。有许多现成的系统(称为数据库)这使您可以在其中放入大量数据,并在很短的时间内访问它们。

简短回答:不,您不能

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

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


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

我认为您的问题是:

32位.NET应用程序可以寻址超过2GB的内存

是的,可以通过调整分配给用户应用程序和操作系统的内存之间的分配来增加应用程序可以处理的内存量,但我不建议在大多数情况下使用它,因为它会导致O/S功能出现微妙的问题,例如网络。有关
/3GB
/USERVA
开关请参见。这将允许应用程序寻址3GB(减去开销)内存,而不是2GB

您可以使用的工具有:

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

我建议您应该编写自己的缓存类。例如,请看一看您可能做错了什么。我编写的.net应用程序使用的内存超过了2GB。如果您运行的是64位windows,您的应用程序没有理由不能使用更多的内存。

我认为您的应用程序很接近ap在.Net应用程序级别上的方法将是一个很好的解决方案


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

应用程序不会执行“写入交换”操作,而是操作系统对应用程序执行的操作。如果您的应用程序/环境仅限于2G地址空间,则不会执行任何“交换”将增加这一点。不幸的是,这正是我所期望的-我认为我真的应该研究内存管理的基础知识,以真正掌握所有这些概念。因此,没有办法获得运行时分配的更多空间?然后我可能必须将字符串写入文件或其他东西来存储它们,直到它们需要为止。交换已经过时了在70年代,虚拟内存系统进行“分页”。在Windows中,虚拟内存被分页到“页面文件”1.这有点早熟的味道optimization@Gjallar-还请了解您将使用的平台的正确术语。如果我没有弄错的话,.Net应用程序可以使用超过2GB的内存。那么您到底有什么问题?我想说,这确实取决于您正在编写的应用程序。在许多情况下,这可能是一个设计问题,但是有时确实需要将大量数据加载到内存中。我不能真正讨论系统的设计,因为我对团队来说是个新手,并且仍在努力掌握系统-但这是我被告知要研究的第一个问题之一,所以我想重新设计稍微超出了我的授权级别。@Kibbee我同意某些应用程序确实需要加载超过2GB的数据。但在OP(许多小字符串)的这种特殊情况下,我真的认为这是一个糟糕的设计。@Gjarlar:然后你可以移动到64位(提供更大的可寻址内存空间),并向老板索要16GB或RAM;-)@Gjarlar看到更新的答案了吗?因为您已经在使用64位OSOk,所以我想我的小示例内存不足,因为列表保留了对所有字符串生成器的引用?我认为这不是问题所在。按我的计算,你只有大约167个街区