2009-05-20 6 views
1

1)을 ClientApp은 ASP.Net 2.0 비동기 호출 WebService를 2) 웹 서비스는 SQL Server 2005의 저장 프로 시저 3 호출) 저장 프로 시저가 데이터 출력을 반환 1백50메가바이트 테이블웹 서비스

한다

메모리 부족 새 행에 더 많은 메모리를 할당하려고 시도하는 동안 DataAdapter.Fill (...)에 의해 예외가 발생합니다.

IIS 응용 프로그램 풀에는 최대 메모리 제한이 없습니다.

IIS 수준의 다른 곳에서 최대 메모리 사용량 대문자가 설정되어 있습니까? DataSet으로 메모리에 읽을 때 150MB db 테이블이 더 많은 공간을 차지합니까? 프로 시저 결과가 웹 서버 메모리에 상주하지 않아도 클라이언트에 직접 스트리밍되는 시나리오 (WCF 사용)가 있습니까?

클라이언트가 비동기 적으로 요청하기 때문에 요청을 작은 데이터 세트로 분할하지 않아도됩니다. 모든 부분을 수집하는 것은 비동기 적으로 발생해야하며 각 클라이언트는 각 호출에 대해 비동기 컬렉션을 구현해야합니다.

모든 제안, 권장 사항 또는 정보를 제공해 주시면 감사하겠습니다.

+0

몇 가지 질문이 있습니다. 1)이 Windows Server 32 비트 버전에서 호스팅됩니까? 2) 응용 프로그램 풀 작업자 프로세스가 충돌 할 때 얼마나 큰 프로세스입니까? – Jeff

답변

5

예, 데이터 세트를 사용하면 실제 데이터보다 훨씬 많은 메모리가 사용됩니다. 얼마나 정량화하기가 어렵지 만, this 질문에 대한 StackOverflow는 원래 데이터 크기의 4 배 이상을 제시합니다. 그것이 맞다고 가정합시다. 150MB의 데이터 시간 4 = 600MB의 메모리. ASP.NET 응용 프로그램에서 약 800MB의 RAM을 사용하면 OutOfMemoryExceptions가 발생하기 시작합니다. 그 한계가 응용 프로그램 풀 메모리 제한과 어떻게 같은지 잘 모르겠습니다. boot.ini에서/3GB 스위치를 사용해 보셨습니까?

은 또한 당신이 당신의 데이터 집합을 직렬화하는 경우, 시리얼 직렬화 (에 원래 크기의 10 배까지 this article를 참조하십시오. 당신이 읽을 때 문제가 발생하는 것을 나타 내기 위해 큰 버퍼를 할당 할 수 있습니다 (지침 this article 참조) 이 데이터는 오류의 원인이 아닐 수 있습니다 (단, 메모리 부족 오류를 해결하고 데이터를 유선으로 보내려고하는 경우 일 수 있습니다).

DataSets에 대한 저의 경험으로는 처음에는 좋은 생각이지만 곧 문제가 생길 것입니다.

또 다른 해결책은 DataReader를 사용하고 한 번에 네 행. 행의 일괄 처리를 반환합니다 (즉, 데이터에 대해 일종의 페이징을 사용). 각 일괄 처리의 크기를 실험하여 성능과 메모리 사용간에 최적의 위치를 ​​찾습니다. WCF 스트리밍은 트릭을 수행 할 수 있지만 한 번의 호출로 엄청난 양의 데이터를 반환 할 수 있도록 WCF를 올바르게 구성해야합니다.

0

모범 사례는 a) 많은 양의 데이터를 반환하지 않고 b) 4 년 된 기술 (ASMX 웹 서비스) 대신 WCF를 사용하는 것이 가장 좋습니다.

+0

WCF는 어떻게 ADO.Net DataSet.Fill() 예외를 처리합니까? 메모리 부족은 DataSet이 웹 서버 메모리에 완전히로드되기 전에 발생합니다. 아직 웹 서비스 응답으로 전송하기 위해 직렬화되기 시작하지 않습니다. WCF를 모두 DataSet의 메모리에로드하지 않고 SQL에서 직접 클라이언트로 스트리밍하도록 구성 할 수 있습니까? – Tion

+2

WCF가 System.IO.Stream을 반환하여 스트리밍 할 수 있다는 것을 알고 있습니다. 최악의 상황이라면 ExecuteReader를 사용할 수 있습니다.그런 다음 출력 Stream에 XmlWriter를 구성하고 Read로 돌아가는 각 행에 대해 내용이있는 단일 XML 요소를 작성합니다. 더 많은 코드이지만 작동해야합니다. 아마 더 좋은 방법이있을 수도 있습니다. 한 번에 150MB를 모두 돌려 주어야합니까? –