首页 新闻 搜索 专区 学院

引发类型为“System.OutOfMemoryException”的异常 怎么办?

0
悬赏园豆:30 [已解决问题] 解决于 2014-01-10 08:36

我有一个程序是在不停地写LOG文件 log是每天更新的,例如20140109.log、20140110.log

大小大概是400M每天,我要获取里面实时更新的数据,本来我是想读一行删一行的,可是由于另一个程序正在使用,不能删除。我又想到读取每一行,将需要的信息筛选出来记录在数据库中,并将读取到哪一行记录在配置文件中


        public List<Msg> GetLogLines()
        {
            List<Msg> msglist = new List<Msg>();

            string datet = DateTime.Now.ToShortDateString();
            string date=DateTime.Now.ToString("yyyyMMdd");
            string logpath = LogPath + "\\" + date + ".log";
            //string[] strs = File.ReadAllLines(logpath, Encoding.Default);
            FileStream fs = new FileStream(logpath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
            StreamReader sr = new StreamReader(fs, Encoding.Default);

            string[] strs = sr.ReadToEnd().Replace("\r\n", "\r").Split('\r');
            fs.Dispose();
            sr.Dispose();
            StringBuilder sb=new StringBuilder(255);
            CtrlIni.GetPrivateProfileString("LastRecordLine", "LastRecordLine", "0", sb, 255, IniPath);
            int StartLine = Convert.ToInt32(sb.ToString());
            for (int i = StartLine; i < strs.Length; i++)
            {
               
                if (strs[i].Contains("user_number[0]"))
                {
                    CtrlIni.WritePrivateProfileString("LastRecordLine", "LastRecordLine", (i + 1).ToString(), IniPath);
                    Msg msg = new Msg();
                    msg.Msg_Phone = strs[i].Substring(30, 11);
                    
                    if (i + 16 < strs.Length)
                    {
                        msg.Msg_Content = strs[i + 16].Substring(28);
                        msg.Msg_State = 0;
                        msg.Msg_Time = DateTime.Now;
                        msglist.Add(msg);
                        
                        continue;
                    }


                }

            }

            //File.Delete(logpath);
            //File.Create(logpath);
            
            return msglist;
        }

 


可是
引发类型为“System.OutOfMemoryException”的异常,我该怎么处理呢?
C#
问题补充:

string[] strs = sr.ReadToEnd().Replace("\r\n", "\r").Split('\r');

是这里抛出..

 

程序运行的时候直接用掉800M的内存

.F.的主页 .F. | 初学一级 | 园豆:13
提问于:2014-01-09 10:00
< >
分享
最佳答案
1

异常是 msglist.Add(msg); 抛出的吗?

收获园豆:30
Launcher | 高人七级 |园豆:45045 | 2014-01-09 10:04

string[] strs = sr.ReadToEnd().Replace("\r\n", "\r").Split('\r');

是这里抛出..

.F. | 园豆:13 (初学一级) | 2014-01-09 10:05

@.F.: 改成 sr.ReadLine

Launcher | 园豆:45045 (高人七级) | 2014-01-09 10:08

@Launcher: 怎么记录下读到第几行了呢?

.F. | 园豆:13 (初学一级) | 2014-01-09 10:13

@.F.: int count = 0;

while(sr.ReadLine) count++;

Launcher | 园豆:45045 (高人七级) | 2014-01-09 10:18

@Launcher:没有readline这个属性啊

.F. | 园豆:13 (初学一级) | 2014-01-09 10:21

@Launcher: 恩   就用这个了   谢谢哈

.F. | 园豆:13 (初学一级) | 2014-01-10 08:36
其他回答(3)
2

假设你这个文件是400M

sr.ReadToEnd()400M没了

sr.ReadToEnd().Replace("\r\n", "\r")又是400M没了

sr.ReadToEnd().Replace("\r\n", "\r").Split('\r')又是400M没了

修改一个字符串的时候原字符串不会发生变化会另外创建一个结果字符串

你干嘛不一行一行的读

吴瑞祥 | 园豆:29369 (高人七级) | 2014-01-09 10:36

这样貌似蛮适合我的

支持(0) 反对(0) .F. | 园豆:13 (初学一级) | 2014-01-10 08:35
0

这样使用,内存伤不起啊~

直接使用:            string[] strs = System.IO.File.ReadAllLines("文件路径");吧

幻天芒 | 园豆:36910 (高人七级) | 2014-01-09 11:58

  这样会省一点   但是   还是好伤不起...

支持(0) 反对(0) .F. | 园豆:13 (初学一级) | 2014-01-10 08:35
2

对于楼主的解决思路有疑义:

(1)记日志为何不用log4net?可以写文件,也可以直接记入数据库

(2)如果log文件是记录数据字段的变化,可以试试CDC:http://www.cnblogs.com/downmoon/archive/2012/04/09/2439462.html

邀月 | 园豆:25375 (高人七级) | 2014-01-09 14:42

   记录日志是别人写好的程序...

支持(0) 反对(0) .F. | 园豆:13 (初学一级) | 2014-01-10 08:35
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册