2010-04-15 7 views
0

나는 웹 사이트에서 900+ 주식에 대한 실시간 시세를 추출하는 프로그램을 연구 중이다. 나는 다음과 같은 코드를 사용하여 스트림을 사이트 및 저장소에 스트림에 대한 응답을 HTTP 요청을 보내고 열을 HttpWebRequest를 사용실시간 주식 시세, StreamReader 성능 최적화

HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
Stream stream = response.GetResponseStream(); 
StreamReader reader = new StreamReader(stream) 

수신 된 HTML의 크기가 큰 (5000 개 라인), 그것은 너무 그것을 파싱하고 가격을 추출하는데 오랜 시간이 걸린다. 900 파일의 경우 파싱 및 추출에 약 6 분이 소요됩니다. 내 상사가 만족스럽지 않다고 말하면 그는 전체 과정을 2 분 안에 완료하기를 원한다고 말했다.

필자는 프로그램을 분석하고 추출하는 데 대부분의 시간이 걸리는 부분을 확인했습니다. 내가 빨리를 만들기 위해 코드를 최적화하기 위해 노력했습니다, 다음은 좀 최적화 후 지금 무엇을 입니다 :

// 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 분 이내에 모든 것을 할 수 있습니까?

+1

파일에서 수행중인 처리의 유형이나 형식이 무엇인지 알 수 없습니다. 좀 더 많은 코드가 도움을 줄 수 있습니다. – AaronLS

+0

나는 하나의 스레드가 파일을 읽고 다른 스레드가 내용을 가져 와서 처리하는 등의 다중 스레드를 고려할 것이다. – AaronLS

+0

나는 i = 0 ~ 1500 루프를 좋아하지 않는다. 좀 더 많은 정보 나 코드를 제공 할 수 있습니까? –

답변

1

나는 주식 시세로 잠시 동안 HTML 화면을 긁어 모으고 있었지만 야후는 ​​웹 사이트를로드하는 것보다 훨씬 좋은 훌륭한 간단한 웹 서비스를 제공한다는 것을 알았다.

http://www.gummy-stuff.org/Yahoo-data.htm

단일 요청에서 100 개 주가 지수까지 요청할 수있는이 서비스를

그것은 모든 심볼에 대해 하나 개의 라인을 CSV 형식의 응답을 반환합니다. 요청의 쿼리 문자열에 반환 할 열을 설정할 수 있습니다. 나는 주식 시장의 모든 주식에 대해 가격을 얻기 위해 하루에 한 번 서비스를 쿼리하는 작은 프로그램을 만들었습니다. 그것은 나를 위해 잘 작동하는 것처럼 보였으며 웹 사이트를 방문하는 것보다 훨씬 빠릅니다.

쿼리 문자열 예제는 다음과

"일반 ELEC CO"의 텍스트를 반환 http://finance.yahoo.com/d/quotes.csv?s=GE&f=nkqwxyr1l9t5p4

, 32.98, "6월 26일", "21.30-32.98", "NYSE"2.66 "월 25, 28.55, "7 월 3 일", "- 0.21 %"

+0

실시간 견적 서비스에 대한 다른 제공 업체가 있습니까? – sean717

1
for(int i=0;i<1500;++i) 
    reader.ReadLine(); 

이 특히 바람직하지 않습니다. ReadLine은 모든 행을 읽고 어딘가에 저장하지만 아무도 그것을 사용하지 않습니다. GC를위한 추가 작업. 바이트 단위로 읽고 \ D \ A를 잡습니다.

그런 다음 StreamReader을 전혀 사용하지 마십시오! 스트림에서 읽는 것은 뚱뚱한 오버 헤드입니다.

1

어떻게 이것이 가능한지 알기가 쉽지 않으므로 StreamReader는 HttpWebRequest와 비교하여 빠른 속도로 처리됩니다. 몇 가지 기본 가정 : 5,000 라인의 900 파일, 6 분 안에 100 개의 문자를 다운로드한다고 가정 해 보겠습니다. 즉, 900 x 5000 x 100 = 450 메가 바이트를 다운로드해야합니다. 6 분이면 450E6/6/60 * 8 = 10Mbps의 대역폭이 필요합니다.

무엇을 가지고 있습니까? 10Mbps는 초고속 인터넷 서비스의 경우 일반적이지만,이를 유지할 수있는 서버가 필요합니다. 2 초 이내에 다운로드하려면 서비스를 30Mbps로 업그레이드해야합니다. 당신의 상사가 해결할 수 있습니다.

속도 향상에 대해 : 캐시를 조심하십시오.

0

실시간 데이터가 빠를 필요가 있다면 사이트에서 데이터를 긁어 내기보다는 데이터 피드를 구독해야합니다.

또는 필요한 필드/데이터 쌍을 찾기 위해 검색 할 수있는 토큰이 없습니까?

4 분 동안 900 파일을 읽는 데 엄청나게 길게 들립니다.

관련 문제