2013-05-22 6 views
1

.net 프레임 워크 4.0을 사용하여 Windows 양식의 주식 시장 응용 프로그램을 개발 중입니다. 교환에서 진드기를 실시간으로 가져옵니다. 나는 진드기를 실시간으로받을 수있다. 제 시나리오에서는 실시간 수집을 쓸 스레드를 만들어야합니다. & 다른 연속적으로 실행되는 백그라운드 스레드가 컬렉션에서 가져옵니다. & 추가 처리는 수행합니다. 이를 달성하기 위해 나는 ConcurrentDictionaryConcurrentQueue의 조합을 사용하고 있습니다. 키 조합 기호 이름 & 값에 ConcurrentQueue가 포함되어 있습니다. 이것이 구현 된 방법입니다. Check first answer실시간 데이터를 저장하는 방법

이것은 지연 문제입니다. 주식 가격이 실시간으로 변동해야하므로이 프로세스는 1 초 지연을 초래합니다. 이 시나리오를 다른 로직으로 구현할 수 있습니까? 아니면 지연을 피하기 위해 ConcurrentDictionary 또는 ConcurrentQueue의 성능을 어떻게 향상시킬 수 있습니까?

+0

당신은 어떤 진단을 수행하지 않았습니다. 기본 사항부터 시작하십시오. 바로 지연의 원인은 무엇입니까? 경합 또는 다른 동기화 오버 헤드를 잠급니다? 또는 자신의 처리? – millimoose

+0

(C#이 아니었고 데이터 아카이브가 필요 없다면 고정 된 수의 레코드를 고성능으로 저장하도록 명시 적으로 설계된 데이터베이스 인'rrdtool'을 살펴볼 것을 제안했을 것입니다.) – millimoose

+0

쓰기 또는 읽기 concurrentDictionary 또는 concurrentqueue에서 지연이 발생합니다 – Tuscan

답변

3

정말로 동시 사전이 필요합니까? 사전은 새 기호를 찾은 경우에만 변경됩니다. 사전에 모든 기호를 알아 낸 경우 일반 사전을 작성하고 심볼 당 대기열로 채우면됩니다. 사전이 그 이상으로 변경되지 않습니다.

처리 스레드가 어떻게 작동하는지 잘 모르겠습니다 - 다음 대기열을 어떻게 알 수 있습니까? 더 많은 데이터가 있는지 확인하기 위해 모든 대기열을 반복합니까? 아마도 당신이 필요로하는 것은 모든 주식 시장 이벤트를 개최 할 하나의 ConcurrentQueue 일 것입니다. 백그라운드에서 별도의 컨테이너로 분할합니다 (동기화가없는 경우도 있음).

+0

일반 사전을 사용하는 경우 다중 스레드가 대기열에서 대기열에 포함 및 대기열에서 데이터를 대기열에서 제외하므로 스레드로부터 안전합니다. – Tuscan

+1

일반 사전은 아무도 변경하지 않는 한 동시 읽기 작업에 안전합니다. 사전은 변경하지 않고 큐는 그대로 유지합니다. 사전은 여전히 ​​동일합니다. – zmbq

1

stmbol-id 및 해당 페이지가 포함 된 개체를 큐에 넣지 말고 작업자 스레드로 각 기호 id에 전용 스레드를 할당하지 않고 큐에서 큐에 넣은 다음 작업자 스레드가 페이지를 간단한 switch case 문을 사용하여 기호 id에 따라 올바른 처리.

이렇게하면 심볼에 대기열이 있는지 여부를 확인할 필요가 없습니다. 당신은 오직 하나의 쓰레드 - 안전한 Queue 타입을 가질 것이고 당신은 처리를 위해 ThreadPool을 사용할 수 있습니다! 이 작업을 수행합니다

작업자 스레드 :

IdPagePair pair = market.Dequeue(); 

if (pair.Id == 1) { Process1(pair.Page); } 

else 

if (pair.Id == 2) { Process2(pair.Page); } 

// etc... 
+0

'쌍'은 무엇을 의미합니까? – Tuscan

+0

쌍은 두 개의 속성, 즉 기호 ID와 연관된 페이지가있는 클래스입니다. –

관련 문제