关于dictionary过大,造成内存溢出的解决方法
马歌 2009-08-10 03:22:04 任务背景:海量数据的信息检索.处理数据总规模我们目前大概是20T,需要对这20T数据进行索引,然后构造一个简易的检索系统.
现在的问题:
假设有一个大文件1T左右,里面每一行是一个单词,任务很简单,统计一下,每个单词出现了多少次,存储下来。
我现在的实现大概是这样的
Dictionary <string,int> a=new Dictionary <string,int>();
while 循环读入 word
{
object b;
b=a[word];
if (b==null)
a.add(word)
else
a[word]++;
}
在处理了大概20G左右数据以后,内存溢出了。
{"引发类型为“System.OutOfMemoryException”的异常。"}
{System.Collections.ListDictionaryInternal}
{System.Collections.ListDictionaryInternal.NodeKeyValueCollection}
{Void Resize()}
System.Reflection.MethodAttributes.Private
|System.Reflection.MethodAttributes.HideBySig
分析应该是dictionary在冲突发生比较大的时候进行扩容,此时可用内存耗光或者超过了2G的限制。
我现在的疑问是
问题1: 2千多万个词,实际上存储的话要几十M就应该够了,为什么我发现占用的内存会很高(占用物理内存就1.5G)呢?远远要超出预估算的值,各位可以简单写个代码往里面存点数据就会发现其实是非常消耗内存的?why?
问题2:如果确实超过内存,那么这项工作该如何实现呢?