Hashtable ht = new Hashtable();
int i = 0;
string Err = "";
try
{
while(i < 10000000) //这里的值可以更大,目的是导致内存溢出。
{
i++;
ht.Add(Guid.NewGuid().ToString(), "TEST");//向哈希表里添加一个元素。
}
}
catch(Exception ex)
{
Err = ex.ToString();
}以上哈希表会产生内存溢出
但是捕获不到错误
请高手帮忙!
谢谢!!!
机子就越来越慢最后我放弃这个方法了
JAVA好像用Hashmap替换了Hashtable
估计原因也是因为这个
在JAVA里Hashtable一样会出现这个内存溢出
四十年来家国,三千里地山河,凤阁龙楼连霄汉,玉树琼枝作烟箩。几曾识干戈?
1 程序设计,编写的有问题,为什么会使用那么大的内存。即使使用这么大的内存,能不能把不用的数据放到缓存中,非要在内存中放着,如果可以就不要简单的使用hashtable。
2 如果出现这种情况,我想唯一能作的就是升级硬件,但这是不明智的,关键还是在1上找办法。
不行一样是内存溢出
而且程序还是无法捕捉到错误
所有无限制的使用内存都会内存溢出,如果出现这种情况,那只能说明
1 程序设计,编写的有问题,为什么会使用那么大的内存。即使使用这么大的内存,能不能把不用的数据放到缓存中,非要在内存中放着,如果可以就不要简单的使用hashtable。
2 如果出现这种情况,我想唯一能作的就是升级硬件,但这是不明智的,关键还是在1上找办法。
-----------------------------------------------
弱弱的一问
怎么把数据放到缓存去
------------------------------------
令一个类可序列化的最简单的方式是按如下所示使用 Serializable 属性标记它。[Serializable]
public class MyObject {
public int n1 = 0;
public int n2 = 0;
public String str = null;
}
以下代码示例说明该类的实例是如何被序列化到一个文件中的。MyObject obj = new MyObject();
obj.n1 = 1;
obj.n2 = 24;
obj.str = "Some String";
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream("MyFile.bin", FileMode.Create, FileAccess.Write, FileShare.None);
formatter.Serialize(stream, obj);
stream.Close();
--》摘自MSDNms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconbasicserialization.htm你也可以反序列化,从文件读到对象的值.
object obj = formatter.Deserialize(stream);如果对文件有要求,你可以使用独立存储区概念来实现,System.IO.IsolatedStorage,请参考MSDN:ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconusingisolatedstorage.htm还有就是Hashtable 是继承了ISerializable,所以可以序列化,和反序列化的,这样你就可以把内存不需要的数据存放到缓存中,释放内存,来为其它程序提供内存空间。
主要目的是要解决重复IP过滤的问题
每秒钟将发生至少80次的请求
我是利用哈希表过滤重复IP
由于是动态的
所以要使用内存
而且数据量非常大
我没有找到可以代替的方式另外不要建议我使用数据库来过滤
肯定当机
我已经试验过了请给个建议
改为 long i = 0;
试一下:
每一个IP地址都可以转化为唯一的一个int32类型的整数,共4G个,
开一个4g/32=128M的int数组(共4g bit=512m byte),数组里每一个int的每一位表示一个ip是否存在,一个int可以表示32个ip是否存在,
比较时先把ip转化成int32格式,然后可以使用二分法查找,查到后判断该位置的数值,如果为1则存在,为0则不存在,
数组需要开512m的虚拟内存空间,因为是稳定的,不需要动态增长,win程序的虚拟内存控件为4g,我想不会有问题的。不过为了速度,最好把内存加大一点。
更正:
转换为uint32格式, 不需要二分法查询,设 ip = n; 数组 int[] ipflags = new int[128m]
index = ip / 32;
subindex = ip % index
int flag = int[index];
bool exists = flag & 2^flag
你可以分个hashtable来处理。
比如说。以字母开头,每个字母一个表。