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

标签 c# memory-management out-of-memory

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

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

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

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

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();
}

我希望将字符串写入交换空间,并且想知道是否有任何方法可以强制应用程序这样做。

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

好吧,为了加强我的问题:如果运行时的唯一限制是一个对象不能分配超过 2 GB 的内存——为什么上面的代码会耗尽内存——因为列表超过了 2 GB通过持有对所有字符串构建器的引用来内存?

最佳答案

简短的回答:不,你不能。

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

如果您需要一次在您的进程中加载​​超过 2GB 的数据(而不是根据需要从磁盘中按 block 检索数据),那么您就遇到了严重的设计问题。


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

关于c# - C# 可以并将对象写入页面文件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9033914/

相关文章:

c# - 如何在C#中声明嵌入式结构(如delphi中的嵌入式记录)?

c# - Entity Framework SQL First 数据库查询

c++ - 开发中如何避免 "swapping of death"?

c++ - 在 mmap 内存中有效分配动态数组

c++ - 动态创建 std::string 时调用两次 'new'

linux - 如何在不冒 OOM killer 的风险的情况下 mmap() 大文件?

java - Jasper 在导出时报告 OutOfMemoryError

c# - 如何在 MonoTouch 和 Objective-C 之间做出选择?

c# - 正则表达式匹配(贪婪/不贪婪?)

c# - 在 Xamarin.Forms 上加载图像时内存不足