2009-09-06 5 views
2

실시간으로 입력 신호 (숫자)를 기록하는 소프트웨어를 개발할 때이 데이터를 어떻게 저장하고 압축하는 것이 가장 좋을까요? SQL 엔진이 앞으로는 빠른 데이터 마이닝을 허용하거나, 초당 최대 1000 개의 데이터 샘플에 적합하거나 압축 될 수있는 다른 데이터 형식이 있습니까?실시간 데이터 로깅을 위해 데이터를 저장하고 압축하는 방법은 무엇입니까?

저는 VC++로 작성하는 데 신경 쓰지 않지만 C#에 적용 할 수있는 아이디어가 이상적입니다.

+0

초당 1000 데이터 샘플, 그러나 몇 초입니까? –

+0

"영원히"생각하십시오! 제 의뢰인은 제가 그 매개 변수에 대한 통제권이 없다고 말합니다. –

답변

2

소스가 무엇인지, 저장된 데이터를 쿼리해야하는지 등과 같은 추가 정보가 없으면 말하기 어렵습니다.

그러나 1000 샘플/초의 경우 메모리에서 몇 초간의 데이터를 잡고 다른 스레드의 영구 저장소에 대량으로 기록해야합니다. (다중 프로세서 시스템 권장).

관리되는 언어를 사용하여 수행하려는 경우 동일한 데이터 구조로 샘플 보관 - GC가 메모리를 너무 자주 수집 할 필요가 없도록합니다. 포인터와 안전하지 않은 키워드 (메모리 구조에 대한 직접 액세스를 제공하고 배열의 범위 검사 코드를 제거함)를 사용하여 성능을 약간 향상시킬 수 있습니다.

각 샘플을 수집하는 데 CPU 시간이 얼마나 필요한지 알 수 없습니다. 시간을 결정하는 데있어 얼마나 중요한지는 지정된 시간에 각 샘플을 읽는 것입니다 (읽는 장치에서 버퍼에 저장됩니까?). 샘플링이 시간에 민감한 경우 샘플 당 1ms가 소요됩니다. 그리고 나서 가비지 콜렉터의 위험을 감당할 수 없을 것입니다. 잠시 동안 스레드를 차단할 것입니다. 이 경우 관리되지 않는 접근 방식을 사용합니다.

SQL Server는 쉽게 데이터를 보관하거나 파일에 쓸 수 있습니다. 그것은 주로 당신이 나중에 데이터로 무엇을해야하는지에 달려 있습니다. 각 샘플의 양은 얼마인지 알 수 없지만 8 바이트라고 가정합시다. 그런 다음 원시 데이터를 기록하기 위해 초 당 8000 바이트가 있습니다. 아마도 약간의 오버 헤드가있을 수 있으므로 10kB/s가 될 수 있습니다. 내가 생각할 수있는 대부분의 저장 메커니즘은이 속도로 데이터를 쓸 수 있습니다. 샘플링을하고있는 스레드가 아닌 다른 스레드에 쓰십시오.

2

관계형이 아닌 시계열 데이터베이스를 볼 수 있습니다. 이것들은 당신이 고려하고있는 종류의 데이터와 사용법을 다루기 위해 최적화 될 것입니다.

KxFame과 같이 인기있는 선택입니다.

관련 문제