解决方案 »
- c#调用批处理并接受返回值
- asp.net 内联框架报错?
- 高手指点,搞了一下午就是搞不定,难道我真的是菜鸟吗?
- 分站 获取主站 cookie
- C# 数据删除元素
- 关于三层项目中,日志写入与try catch的问题
- 请问怎么对Listbox里所有的数据依次进行相同的运算然后再用运算结果替代以前的数据?
- 求改进一个正则表达式
- 求救啊!请问在asp.net中(我用的C#.net)中怎么调用DTS,
- 求教函数 System.Text.Encoding.Default.GetBytes() 的问题,谢谢赐教!!!
- 关于异常时弹出的窗口
- 关于实现二叉树的IEnumerable<TItem>.GetEnumerator()的问题
让抓取的同时能够对数据处理只开一个处理的线程就够了,若果是多核的就多开几个总之,正则表达式处理大量数据时占用CPU很多是很正常的
说的也是,但终究不是办法,如果一个程序只能开一两个线程,那吸引力会大打折扣。但是 你能解释下为什么两段几乎相同的代码,占用CPU资源却相差90% 左右呢?我保证两段代码除了正则表达式不一样之外,其它都相同。
另外使用RegexOptions.Compiled会有一定作用 static Regex regexLink = new Regex(@"(href|HREF)[ ]*=[ ]*[""'][^""'#>]+[""']", RegexOptions.Compiled);
static Regex regexEmail = new Regex(@"[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6}", RegexOptions.Compiled);
public static string[] ExtractLinks(string html) {
Collection<string> urls = new Collection<string>();
try {
MatchCollection matches = regexLink.Matches(html);
string str = null;
foreach (Match match in matches) {
str = match.Value;
urls.Add(str);
}
} catch (Exception ex) {
Console.WriteLine(ex.Message);
} return urls.ToArray();
}
public static string[] ExtractEmails(string html) {
Collection<string> emails = new Collection<string>();
try {
string str = null;
MatchCollection matches = regexEmail.Matches(html);
foreach (Match match in matches) {
str = match.Value;
emails.Add(str);
Thread.Sleep(1);
}
} catch (Exception ex) {
Console.WriteLine(ex.Message);
}
return emails.ToArray();
}
谢谢,照你说的试了,但似乎没有效果把 RegexOptions.Compiled 和 RegexOptions.IgnoreCase 都去掉,也没有降低CPU资源,两段代码只有正则表达式不同,那应该是表达式写的好坏影响了CPU资源?在程序里我如果只保留上面的第一段代码,去掉第二段代码,CPU资源占用在10%之内
因为抽取Link的那个正则里href|Href这个条件太强了,这样可以直接跳过很多字符
而Email中的[A-Za-z0-9]+就相对很弱了,正则引擎会进行很多尝试不过我这边的测试也只是慢了一半而已
string str = @"[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6}";
两个正则抓取的内容不一样,怎么有可比性。第一个范围比较小,会检测你的href有没有匹配成功,没有匹配成功就匹配失败。
而第二个正则会[A-Z0-9._%+-]这个范围可就广了,一个网页内容大部分都会匹配到,然后在继续去匹配接下去的。
如果匹配速度比抓取速度快,那么CPU利用率就很低
如果比配速度比抓取速度慢,那CPU可能就很吃力了
你可以先用 string.IndexOf 查询所有的 “@”,然后依次仅仅取出前后30个字节来这时候才用正则。正则是一个编程小技术,它是最慢速的字符串处理,不要当作拿来就套用的东西。