2012-04-20 5 views
0

신호 세트를 표시해야합니다. 각 신호는 수백만 개의 샘플로 정의됩니다. 샘플 (비트 맵 크기에 따라 샘플을 포인트로 변환하기위한)을 처리하는 것은 (특히 스크롤하는 동안) 상당한 시간이 걸립니다.샘플이 많은 드로잉 신호

그래서 어떤 종류의 다운 샘플링을 구현했습니다. 몇 가지 사항을 건너 뜁니다. 신호 특성에 따라 매 2 일마다, 매 3 일마다, 매 50 일마다마다 걸립니다. 속도는 매우 빨라지지만 신호 형식은 상당히 왜곡됩니다.

더 똑똑한 접근 방법이 있습니까?

+1

몇 가지 설명을 해 봤지만 그 신호가 무엇이고 실제로 무엇을하려고하는지 아직 알 수 없습니다. – SimpleVar

+0

참고 : 수백만 개의 데이터 포인트에 대해 이야기하고 있다면 아마도 실시간 시각화 신호 일 것이며 .NET *은 사용하지 마십시오. 예를 들어, Python을위한 훌륭한 라이브러리가 많이 있습니다. – Tigran

+0

이 다른 질문보기 [대용량의 데이터 그리기] (http://stackoverflow.com/questions/4817960/charting-massive-amounts-of-data) – Justin

답변

2

최근 응용 프로그램에서 비슷한 문제가있었습니다. 우리의 시각화 (단순한 선 그래프)는 데이터의 전체 범위 (6 초마다 샘플을 취한 약 7 일 샘플)를보기 위해 축소했을 때 너무 혼란스러워졌습니다. 따라서 다운 샘플링은 실제로가는 길이었습니다 . 우리가 그렇게하지 않는다면, 크게 축소하는 것은별로 의미가 없을 것입니다. 화면 전체에 선이 뭉개진 것뿐입니다.

모두 어떻게 다운 샘플링을 구현할 것인가에 달려 있습니다. 두 가지 (간단한) 접근 방식이 있습니다. 샘플을 가져 오는 순간에 다운 샘플링하거나 표시 시간에 다운 샘플링하는 것입니다. 두 경우 모두에서 엄청난 성능 향상을 가져다주는 것은 데이터 원본을 적절하게 선택하는 것입니다.

샘플이 700 만 개이고 시청 창이 지난 백만 점에 관심이 있다고 가정 해 보겠습니다. 구현이 IEnumerable에 의존하면 IEnumerable이 실제로 시작하기 전에 6 백만 번 MoveNext를 가져야 함을 의미합니다. 그러나 임의에 최적화되어 뭔가를 사용하는 경우 것이 (목록이 마음에 온다), 당신이 그것에 대해 자신의 열거를 구현할 수 있습니다 읽고, 더 많거나 적은 같은 :

public IEnumerator<T> GetEnumerator(int start, int count, int skip) 
{ 
    // assume we have a field in the class which contains the data as a List<T>, named _data 
    for(int i = start;i<count && i < _data.Count;i+=skip) 
    { 
     yield return _data[i]; 
    } 
} 

을 분명히 이것은 매우 순진하다 구현하지만, for-loop 내에서 원하는 모든 작업을 수행 할 수 있습니다 (주변 샘플을 기반으로 한 알고리즘을 사용하여 평균을 계산합니까?). 그러나이 방법은 신호의 극단적 인 스파이크를 부드럽게 처리하므로주의하십시오.

또 다른 접근법은 새로운 신호를 수신 할 때마다 자체를 업데이트하는 다양한 범위에 대해 데이터 집합의 일반화 된 버전을 만드는 것입니다. 일반적으로 전체 데이터 집합을 업데이트 할 필요는 없습니다. 세트의 끝을 업데이트하는 것만으로도 충분할 것입니다. 이렇게하면 데이터 처리 과정을 조금 더 고급화 할 수는 있지만 더 많은 메모리가 소요됩니다. 애플리케이션에 세부적인 '레이어'를 캐시해야합니다.

그러나 (짧은) 설명을 읽으면 디스플레이 시간 최적화로 충분하다고 생각합니다. 일반화하면 항상 신호에 왜곡이 생깁니다. 항상 데이터가 손실됩니다. 이 왜곡이 어떻게 발생하는지, 그리고 그것이 얼마나 두드러 질 것인지를 결정하는 것은 알고리즘에 달려 있습니다.

1

더 나은 샘플링 알고리즘이 필요하며 C#의 병렬 처리 기능을 사용할 수도 있습니다. Task Parallel Library

관련 문제