我正在开发一个程序,从网站上提取900+股票的实时报价。我使用HttpWebRequest将HTTP请求发送到站点,并存储对流的响应,然后使用以下代码打开流:
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream stream = response.GetResponseStream ();
StreamReader reader = new StreamReader( stream )接收到的超文本标记语言很大(5000+行),所以解析它并提取价格需要很长时间。对于900个文件,解析和提取大约需要6分钟。我的老板对此很不满意,他告诉我他希望整个过程能在两分钟内完成。
我已经确定了程序中需要花费大部分时间来完成的部分是解析和提取。我已经尝试过优化代码以使其更快,以下是经过一些优化后我现在所拥有的:
// skip lines at the top
for(int i=0;i<1500;++i)
reader.ReadLine();
// read the line that contains the price
string theLine = reader.ReadLine();
// ... extract the price from the line现在处理所有文件大约需要4分钟,与我老板的期望仍有很大差距。所以我想知道,有没有其他方法可以进一步加快解析和提取速度,并在2分钟内完成所有工作?
发布于 2010-04-16 01:38:04
我做了一段时间的HTML屏幕抓取股票行情,但我发现雅虎提供了一个伟大的简单的web服务,这比加载网站要好得多。
http://www.gummy-stuff.org/Yahoo-data.htm
使用此服务,您可以在单个请求中请求多达100个股票报价,并且它将返回csv格式的响应,每个符号占一行。您可以设置要在请求的查询字符串中返回的列。我创建了一个小程序,每天查询一次股票市场上的每只股票的价格。它似乎对我很有效,而且比访问网站获取数据要快得多。
查询字符串的示例为http://finance.yahoo.com/d/quotes.csv?s=GE&f=nkqwxyr1l9t5p4
返回以下内容的文本:
"GENERAL ELEC CO",32.98,"Jun 26","21.30 - 32.98","NYSE",2.66,"Jul 25",28.55,"Jul 3","-0.21%“
发布于 2010-04-16 01:23:16
for(int i=0;i<1500;++i)
reader.ReadLine();这一点特别不好。ReadLine读取所有行并将其存储在某个位置,但没有人使用它。GC的额外工作。逐字节读取并捕获\D \A。
那就完全不要使用StreamReader!这是很大的开销,从流中读取。
发布于 2010-04-16 02:05:09
很难看出这是如何实现的,与HttpWebRequest相比,StreamReader的速度快得令人眼花缭乱。一些基本假设:假设你正在下载900个文件,5000行,每行100个字符,在6分钟内。这意味着您需要下载900x5000x100=450MB。在6分钟内,这需要450E6 /6/ 60 *8= 10 Mbps的带宽。
你有什么? 10 Mbps对于高速互联网服务来说大约是典型的,尽管你需要一个能够支持这一点的服务器。要将其降低到2秒,您需要将您的服务升级到30 Mbps。你的老板可以解决这个问题。
关于你所看到的速度提升:注意缓存。
https://stackoverflow.com/questions/2647490
复制相似问题