【发布时间】:2012-01-27 13:26:31
【问题描述】:
我想知道 C# 是否可以将对象写入页面文件。
我已经知道 .NET 应用程序的虚拟机仅限于允许一个对象仅使用 2 GB 的内存,并且在此之前很久就会耗尽内存 - 即使在 64 位版本的 Windows 上也是如此。
但是,我需要能够加载大量字符串(不是 1 个大字符串,而是许多小字符串),并且想知道是否可以加载它们并将它们写入交换空间,直到再次需要它们(不幸的是,我无法阻止所有字符串的加载,因为它是由调用我正在处理的代码的应用程序强制执行的)。
为了对其进行原型设计,我尝试查看以下程序是否也会耗尽内存(它会),即使它没有尝试分配一个巨大的字符串:
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通过持有对所有字符串生成器的引用来记忆?
【问题讨论】:
-
“写入交换”不是应用程序所做的事情,而是操作系统对应用程序所做的事情。如果您的应用/环境仅限于 2G 地址空间,那么“交换”的数量不会增加。
-
不幸的是,这正是我所期望的——我认为我真的应该研究内存管理的基础知识才能真正掌握所有这些概念。那么有没有办法让运行时分配更多的空间呢?然后我可能不得不将字符串写入文件或存储它们直到需要它们的东西。
-
交换在 70 年代过时了。如今,虚拟内存系统进行“分页”。在 Windows 中,虚拟内存被分页到“页面文件”。
-
这有点过早优化的味道
-
@Gjallar - 还请了解您将使用的平台的正确术语。如果我没记错的话,.Net 应用程序可以使用超过 2GB 的内存。那你到底在问什么?
标签: c# memory-management out-of-memory