我写了个Windows 窗口程序.
其中用到一个很大的HashTable对象,要装1亿个关键字。
我测了一下以下代码,
Hashtable childNodes = new Hashtable();
for (int i = 0; i < 100000000; i++)
{
childNodes.Add(i, "aaaaaaaaaaa");
}我的电脑 4G 内存,每次当它执行到1720万左右个关键字时,抛出 xception of type 'System.OutOfMemoryException' was thrown.
这是我看一下任务管理器,这个程序的进程大概只用了525M 左右内存。我的电脑:Windows XP Pro; 32位的机器; 4G 内存;
我用: VS2010
请问,为什么在内存还有很多的情况下,.NET这么早抛出错误?
该如何解决这个问题?
是不是可以在那里进行必要设置?急!谢谢大家!!!
其中用到一个很大的HashTable对象,要装1亿个关键字。
我测了一下以下代码,
Hashtable childNodes = new Hashtable();
for (int i = 0; i < 100000000; i++)
{
childNodes.Add(i, "aaaaaaaaaaa");
}我的电脑 4G 内存,每次当它执行到1720万左右个关键字时,抛出 xception of type 'System.OutOfMemoryException' was thrown.
这是我看一下任务管理器,这个程序的进程大概只用了525M 左右内存。我的电脑:Windows XP Pro; 32位的机器; 4G 内存;
我用: VS2010
请问,为什么在内存还有很多的情况下,.NET这么早抛出错误?
该如何解决这个问题?
是不是可以在那里进行必要设置?急!谢谢大家!!!
解决方案 »
- 关于使用Mysql插入数据显示问号的问题?
- 高分救助,高手进(有谁知道这段代码的意思,详细解释下)
- 如何有效防止C#被反编译
- 为什么我的程序在客户那儿,一切换中文输入法就没响应?
- C# 多线程网络程序问题
- 字符串处理问题
- 如何让webservice服务端只有一个实例和每会话一个实例
- 连接未关闭。连接的当前状态为已打开。
- 如何用google的webservice来实现对自己网站进行google的搜索功能!
- 好何进行字符分割?
- 循环执行这样的代码会会影响程序的速度 Form1 f1 = Application.OpenForms["Form1"] as Form1;
- asp.net 如何将excel百万条数据导入到sql里面
for训话里面,执行n调后,调用一下下面的这段,试试。 System.Diagnostics.Process p = System.Diagnostics.Process.GetCurrentProcess();
if (p.WorkingSet > 40960000)
{
p.MaxWorkingSet = p.MaxWorkingSet;
}
目前我用别人实现的C#版B+树算法来做的。
http://sourceforge.net/projects/bplusdotnet/
测试了几次,没办法等到异常,太久了,忙…
你自己试试这样,清理掉堆栈调用的垃圾试试,当你add时候,系统应该做了不少事情,这些内存回收可能会让你的程序跑的更久一点。Hashtable childNodes = new Hashtable();
for (int i = 0; i < 100000000; i++)
{
childNodes.Add(i, "aaaaaaaaaaa");
if (i % 100 != 0) continue;
GC.Collect();
GC.WaitForFullGCComplete();
}
不过我的感觉是Hashtable对象内存溢出了,
你看下这片纹章
http://topic.csdn.net/t/20050527/15/4040275.html
为什么是
p.MaxWorkingSet = p.MaxWorkingSet;
等号2边怎么是相同的???
1、用64位操作系统配合64位机器(对于企业来讲是最简单的方案,就是花钱的事儿)
2、程序弄复杂一些,改为多进程,自己写个算法分配不同的数据到不同进程,不过4G内存还是不够。
3、用二叉树别用HashTable,比如SortedSet,可以节省一些内存,但速度会慢,同样受2G内存的限制,1亿肯定不行。
4、修改整个方案,别都在内存中弄,不过速度会更慢。
因为动态的hash表要重组,重组的地址空间是原地址空间的2倍(不包括内容),所以原地址空间大于可用空间1/3的时候就会内存不足了。解决这个问题可以在new的时候指定一个极限容量(可以用二分法测试)不让它重组。就算这样要装1亿关键字也很难。
如果楼主的关键字固定不变而且平均长度在20字符左右的话,可以考虑自己写一个静态hash类。