本人使用.net也有五六年了,最近写了个需要长时间从网络进行数据采集的程序,因为采集程序是类似爬虫的功能,是从指定一些网站按一定的规则来爬。
因为爬虫纵向深度较大,网站数据量也很大,经常一个网站至少要运行几天,所以一个程序要运行几天到几十天不等,程序现在已经写出来了,但问题也来了:
内存泄漏。以前没有写过运行时间这么长的数据密集型操作。起初也遇到了性能问题,通过“注释-》观察-》再注释-》再观察...”解决了,但运行时间都不长,问题在短时间内也很明显。但现在内存泄漏很不明显,一个小时增5M,有时看不出来,但时间稍长一定会出现,运行个三五天或再多几天,内存耗尽,程序就挂了。
所以想知道,写代码时从哪些方面可以注意以避免此类问题,总不能写个类似程序,然后每次都要例行的来使用.net memory profile来进行调试吧?
曾经试过定期重启程序,但程序的中间数据有时难以序列化,很多操作续接也相当复杂。特别是程序如果一有变动影响到这块,就更复杂了。有没有更好的办法呢?
不释放已经处理过的东西的吗?
当然会释放了,基本上每一行代码我至少扫描了十遍以上,这个程序已经持续半年了。
@沧海一杰: 我之前写过一个采集程序, 也有这个问题。 我用了SetProcessWorkingSetSize
[DllImport("kernel32.dll")] public static extern bool SetProcessWorkingSetSize(IntPtr process, int minSize, int maxSize); private void C() { if (_flag >= _pointList.Count) { GC.Collect(2); GC.WaitForPendingFinalizers(); GC.Collect(); webBrowser1.Dispose(); webBrowser1 = new ExtendedWebBrowser(); SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1); return; } _gp = _pointList[_flag]; Thread.Sleep(_gp.Interval);
...........
已经用了一年了, 没什么问题。 不过。。。 因为没看到你的代码。。。 我只能说用SetProcessWorkingSetSize可以设置操作系统划分给进程使用的内存容量。。。 不排除影响其它的。。。。
最好还是优化代码、释放、回收。 而且这东西我觉得也要负载均衡, 一台控制服务器做调度, 给其它服务器分配采集任务。。。只有一台去做采集………………囧
@问天何必: 就你一个人回答了,其实你的方法我以前已经知道了,但对我的问题似乎没多大效果。谢谢。