2009-07-08 2 views
3

저는 클라이언트 응용 프로그램의 백엔드로만 사용되는 .NET 2.0 웹 응용 프로그램이 있습니다.이 응용 프로그램은 1-500KB의 데이터가 포함 된 요청을 보내고 서버는 해당 데이터를 처리 한 다음 데이터베이스를 쿼리하여 200KB에서 200MB 사이의 데이터를 클라이언트에 반환하는 일련의 데이터를 작성하십시오. 데이터는 데이터베이스에서 완전히로드되는 데 최대 15 분, 클라이언트에 완전히 전송되는 데 최대 1 시간이 걸릴 수 있습니다 (일반적으로 20 초 쿼리, 10 초 전송). 그러나 데이터베이스 쿼리와 클라이언트의 일부 조합의 경우 DB가 더 빨라지는 경우도 있고 클라이언트에 대한 링크가 더 빠를 수도 있습니다..Net 디스크 버퍼링 된 스트림을 찾고 있습니다.

클라이언트는 다양한 품질의 링크를 통해 연결됩니다 - 일부는 10MB LAN 이상이고 일부는 공유 된 64kbps ISDN 링크를 통해 연결됩니다. 나는 내가 지키길 바란 네 가지가있다 :

  1. 데이터베이스 연결은 가능한 한 짧게 열어야한다.
  2. 최소 서버 메모리를 사용해야합니다.
  3. 데이터를 가능한 빨리 클라이언트에 스트리밍해야합니다.
  4. 프로세스의 총 지속 기간은 두 프로세스의 시간 합계가 아니라 가능한 두 프로세스 (DB 대기 시간, 네트워크 전송 시간)의 최대 값에 근접해야합니다.

    데이터는 DB에서 가져온이므로
    1. 는 응답 스트림에 기입 :

    지금까지, 우리는 세 가지 모드 우리의 코드를 실행할 수 있습니다.

  5. DB에서 데이터를 가져 오면 메모리에 저장합니다. DB 읽기가 완료되면 DB 연결을 닫고 메모리에서 응답 스트림으로 데이터를 씁니다.
  6. DB에서 데이터를 가져 오면 임시 파일에 씁니다. DB에서 읽기가 완료되면 DB 연결을 닫고 임시 파일을 읽고 응답 스트림에 씁니다.

예상대로 모든 시나리오에 대한 요구 사항을 모두 만족하는 것은 아닙니다. 우리는 우리가 사용해야하는 세 가지 코드 패쓰 중 몇 가지 변수를 기반으로 추측 할 수있는 코드를 구현하는 방법에 대해 이야기했습니다. 그러나 좀 더 일반적인 해결책이 있다고 생각합니다. 그리고 이것을 처리 할 수있는 라이브러리/라이브러리를 찾고 있습니다. 우리를 위해.

내가 찾고있는 것은 .NET 스트림 (출력 스트림)을 HttpHandler에서 쓸 수있는 뭔가이며, 기본 스트림에 데이터를 쓰는 것을 처리합니다. 기본 스트림에 보류중인 데이터가 너무 많으면 메모리에 저장되고 가능한 나중에 데이터를 보냅니다. 일단 메모리 내 버퍼가 너무 커지면 임시 파일로 버퍼로 되돌아갑니다. 스트림을 닫으려고하면 모든 데이터가 스트림에 기록 될 때까지 차단됩니다.

내가 시작점으로 사용하거나 이와 비슷한 라이브러리가 있거나,주의해야 할 것들에 대한 지침으로 사용할 수있는 코드를 알고 있습니까? 또는이 솔루션을 완전히 오버 엔지니어링하려고합니까?

+0

.NET 3.0/3.5 솔루션이 옵션 일 수 있습니다. 다른 방법이 없으면 사용자 지정 구현의 디자인을 알릴 수 있습니다. –

답변

2

운영 체제는 적절한 시간에 디스크를 메모리에 스왑하는 데 정말 좋습니다. OS를 추측하기보다는 일반적인 버퍼링 된 스트림을 사용하고 스왑 공간을 파일 백업으로 사용하는 것이 어떻습니까?

+0

제 경험상, 관리되지 않는 앱에서는 괜찮을 수 있지만 관리되는 앱에서는 좋지 않을 수 있습니다. 내가 보았던 것에서, 시스템이 추억의 압력을 받고있을 때.NET은 많은 GC를 실행하기 때문에 페이지가 다시 참조되어 무엇을 참조하는지 확인할 수 있습니다. 다시 말하지만, 이것은 비슷한 상황에서 본 것을 기반으로합니다. 즉, 아마도 BufferedStream의 구현이이를 처리하기위한 작업을 수행 할 것입니다. 옵션 목록에 추가 할 것입니다. –

+0

당신이 어떤 해결책을 가지고 있더라도, 적어도 이것을 시도해야합니다. 나는 완전히 틀릴 수도 있지만 그것이 어떻게 수행되는지 듣고 싶습니다. –

+0

그리고 저는 경영진이 문제를 조사 할 시간을 할당하는 것을 좋아할 것입니다. 이 시점에서 클라이언트를 대기 상태로 만드는 현재의 방법이 "충분 함"으로 간주됩니다. 어쩌면 나중에 나는 이것으로 돌아갈 시간을 가질 것이다. 생각에 감사드립니다. –

관련 문제