For内存溢出循环异常

本文关键字:异常 循环 溢出 内存 For | 更新日期: 2023-09-27 18:15:50

实际上,我得到了一个像save in Db这样的需求,combinations of 9 digit number是加密格式的。

因此,我使用了一个非常基本的加密算法,并考虑使用for循环直到999,999,999,并将记录保存在DataTableBulkCopy to SQL中。

我的程序是这样的:

DataTable DtData = new DataTable();
DtData.Columns.Add("ENCRYPTED_DATA", typeof(string));        
for (Int64 i = 1; i <= 999999999; i++)
{
    string Number = i.ToString("D9");
    string Encrypt = EncryptDecrypt.Encrypt(Number);
    DtData.Rows.Add(Encrypt);
    if (i % 100000 == 0)
    {
        GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
    }
}

但我的问题是我得到out of memory exception一段时间后。
是否有一种方法Garbage Collect或其他方式,并保存内存消耗?
实际上GC.Collect的代码根本没有减少内存使用,我可以在TaskManager中看到。

我的PC RAM is 16GB和处理8,000,000 records is 7 minutes所需的大约时间。
在消耗16GB后,它根据TaskManager给出OutOfMemoryException
是否有一种方法可以减少内存消耗并使我的for循环完全执行?

For内存溢出循环异常

GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);

不释放DataTable DtData中已经存在的数据。我不知道你创建的字符串的大小但是你创建了数千个字符串并将它们添加到DataTable DtData中。

DtData中的这些字符串在此循环范围内永远不符合垃圾回收的条件。

应该定期向数据库提交数字,如下所示

DataTable DtData = new DataTable();
DtData.Columns.Add("ENCRYPTED_DATA", typeof(string));        
for (Int64 i = 1; i <= 999999999; i++)
{
    string Number = i.ToString("D9");
    string Encrypt = EncryptDecrypt.Encrypt(Number);
    DtData.Rows.Add(Encrypt);
    //vary this number depending on your performance testing and application needs
    if (i % 100000 == 0)
    {
        //instead of this 
        //GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);

        //commit changes and refresh your DataTable
        DoSomeDatabaseCommitHere(DtData);
        DtData = new DataTable();
    }
}

您还可以使用Collection类- MSDN代替DataTable,以获得更多选项和异步上传

您的DtData正在填满并占用您所有的内存。

世界上所有的垃圾收集都没有用。

不时地将数据保存到数据库中,并清空DtData数据表。