2010-05-20 2 views
2

인사말,데이터 로거에서 데이터를 캐싱하기위한 접근 방식

저는 데이터 로거와 상호 작용하는 C# .NET 응용 프로그램에서 작업 해 왔습니다. 사용자는 지정된 시간 동안 로그를 쿼리하고 얻을 수 있으며 데이터의 플롯을 볼 수 있습니다. 일반적으로 새 데이터 로그가 매분마다 생성되고 몇 가지 매개 변수에 대한 측정 값이 저장됩니다. 로거에서 의미있는 정보를 얻으려면 최소한 며칠 동안 데이터를 수집해야합니다. 하드웨어 인터페이스는 장치의 UART 대 USB 모듈로 최대 약 30 로그/초로 전송을 제한합니다. 수 일/주에 걸쳐 수집 된 데이터를 읽을 때 이것은 매우 느려집니다.

내가 뭘하고 싶은지는 사용자의인지 된 성능을 향상시키는 것입니다. 하드웨어 속도 제한으로 인해 사용자는 적어도 더 큰 데이터 집합을 처음 획득 할 때 전체 다운로드주기를 기다려야 할 것입니다. 내 목표는 앱에서 본 모든 데이터를 캐시하여 다시 요청하면 빠르게 얻을 수 있도록하는 것입니다. 내가 고려해 오던 접근법은 SqlServerCe와 같은 가벼운 데이터베이스를 사용하여 데이터 로그를받을 때 저장할 수 있습니다. 그런 다음 장치를 쿼리하기 전에 먼저 캐시를 검색하려고합니다. 캐시는 아직 캐시되지 않은 요청에 의해 획득 된 모든 로그로 갱신됩니다.

마지막으로 제 질문 -이 방법을 좋은 방법이라고 생각하십니까? 당신이 생각할 수있는 더 나은 대안이 있습니까? 나는 SO와 Google에서 아이디어를 강화하려고 노력했지만 대부분 웹 요청/콘텐츠 캐싱에 대한 토론을 시작합니다.

의견을 보내 주셔서 감사합니다.

답변

2

매우 합리적인 접근 방식처럼 보입니다. 개인적으로 SQL CE를 사용하여 저장소에 보관할 것이므로 레코드의 datetime을 보유한 열을 인덱싱 한 다음 인덱스에서 TableDirect를 사용하여 데이터를 가져오고 삽입하여 빠르게 타격을 주도록하십시오. 데이터가 이미 연대기이므로 느린 SQL 쿼리 프로세서가 필요 없으며 날짜 (또는 끝)를 찾고 SqlCeResultSet을 사용하여 롤 포워드 할 수 있습니다. I/O에 의해서만 속도 제한이 끝납니다. 필자는 프로젝트에서 실제로 정말 비슷한 것을 수행했으며 SQLCE를 사용하는 TableDirect가 플랫 바이너리 파일만큼 빠르다는 것을 발견했습니다.

1

나는 쿼리 가능 형식으로 로컬에 저장하려는 올바른 방향에 있다고 생각합니다.

SQLite를 강력히 추천합니다. .NET 클래스 here이 있습니다.

관련 문제