2011-09-20 2 views
0

현재 프로젝트 : TCP/IP를 통해 건강 관련 데이터가 넘쳐 흐르는 원격 서버에 연결하고 있습니다. 받은 바이트 스트림은 개체로 구문 분석되고 개체는 SQL Server 데이터베이스에 저장됩니다. 데이터베이스의 클라이언트는 거의 실시간으로 데이터를 볼 것으로 예상됩니다.C#의 높은 철저한 스트리밍 데이터 응용 프로그램을위한 아키텍처?

문제는 응용 프로그램이 원격 서버의 최대 출력을 따라갈 수 없다는 것입니다. 우리는 애플리케이션을 프로파일 링 했으므로 아무런 방법도 압도적으로 느려지지 않습니다.

나는이 문제가 적어도 몇 번 이상 해결되었다고 가정하고 있습니다. 누구든지이 문제와 관련하여 제안, 요령 또는 참조를 갖고 있습니까?

답변

0

작업의 대부분을 분해하고 다른 빠른 방법을 찾아보십시오. 예를 들어, 개별 함수를 구문 분석하는 데이터가 느리지는 않지만 전반적으로 구조체에 바이트를 보관하거나 안전하지 않은 캐스팅을 사용해야하는 경우보다 훨씬 오래 걸릴 수 있습니다. DB 삽입에 문제가있을 수 있습니다 (대량 삽입을 사용하고 있습니까?). DB 구조를 변경해야 할 수도 있습니다. 더 많은 정보가 없으면 어느 누구도 단 하나의 문제를 정확하게 지적하기가 어렵습니다.

+0

귀하의 의견에 감사드립니다, chrispr. 지금 우리는 SqlBulkCopy를 사용하고 있습니다. 또한 대기열 수가 미리 정의 된 값보다 클 경우 데이터 항목을 대기열에 저장하고 저장합니다. 데이터베이스 구조 자체는 꽤 간단합니다. 우리는 실제로 어떤 종류의 ID 필드도 사용하지 않으며 데이터베이스를 데이터 덤핑 지로 간주하여 관계를 강화하는 대신이를 사용합니다. –

+0

응용 프로그램이이를 따라 잡을 수 없다고 말할 때 병목은 어디에 있습니까? CPU 인 경우 대부분의 리소스를 사용하는 영역을 찾으십시오. 구문 분석하는 경우 각 레코드에 대해 새 개체를 만드는 것이 아니라 들어오는 데이터를 구문 분석하는보다 효율적인 방법이 있습니다. 또한 스레딩을 염두에 두십시오. 초당 수천을받는 경우 새 객체에 대한 이벤트를 발생시키는 경우에도 응용 프로그램에 큰 손실을 줄 수 있습니다. – chrispr

0

당신이 말한 것을 기반으로 병목 현상이 네트워크 I/O에있는 것 같습니다.

Q : 데이터를 압축하고 있습니까?

+0

들어오는 데이터는 압축되지 않으며 데이터베이스에 저장할 때 압축하지 않습니다. 압축 사전 데이터베이스 삽입 도움이 될까요? –

+0

병목 현상이 네트워크 I/O (전선을 통해 데이터를 복사하여 데이터베이스에 삽입 할 수 있음) 인 경우 네트워크 트래픽을 압축하면 도움이 될 수 있습니다. – paulsm4

관련 문제