2017-04-01 13 views
0

ASP.NET MVC 응용 프로그램에서 나는 xlsx 파일에있는 계산을 수행하고 있습니다. 우리는 계산에서 18K 변수 (xlsx 파일은 약 10MB 임)를 말하므로 SpreadSheetGear 인스턴스에로드하는 데 시간이 걸립니다. 따라서 요청 사이에 SpreadSheetGear 개체를 캐시해야합니다. 그렇지 않으면 각 요청에 영원히 걸릴 것입니다.ASP.NET MVC 응용 프로그램에서 SpreadSheetGear 객체를 캐시하는 방법은 무엇입니까?

지금 당장 In-Proc 응용 프로그램 캐시와 세션 캐시를 사용하여 요청간에 데이터를 저장합니다. 내 테스트 환경에서 IIS의 응용 프로그램 풀은 세션 시간 초과 (나는 기본 20 분이라고 생각하는 것)보다 빨리 (때로는 단 몇 분만) 재순환합니다. 풀 재활용은 모든 In-Proc 캐시 데이터의 손실을 초래하고, 긴로드 절차가 다시 발생해야합니다.

  1. SpreadSheetGear 객체를 직렬화하는 기능은 없습니다 (예 : xlsx 형식으로 저장하는 것 외에는). 그것을 직렬화 할 수 있다면 프로세스 캐싱 캐쉬로 전환 할 수 있습니다. 하지만 그때조차도 In-Proc 메모리 캐시에 비해 성능이 어떻게 작동하는지 조금 회의적입니다.
  2. 나는 왜 재활용이 일어 났는지 알 수 없었다. 서버가 메모리가 부족하지만 IIS 응용 프로그램 풀에 메모리 제한이나 VM 메모리 제한이 설정되어 있지 않습니다. IIS 로그에서 재활용 이벤트를 찾지 못했습니다.
  3. 응용 프로그램 풀 재활용에서 생존하기 위해 In-Proc 메모리 데이터를 보호 할 수있는 방법이 있습니까?

누구나 SpreadSheetGear + ASP.NET MVC + IIS와 유사한 경험이 있습니까?

+0

지금까지 우리가하려고 시도 할 것은 Azure VM으로 상태 서버를 시작할 수 있습니다. VM은 확장 할 수 있습니다 (일부 제한 사항 : 가용성 그룹에서 미리 프로비저닝 됨). 비 라운드 로빈, ARR 인식로드 밸런서를 멋지게 shim 할 수 있다면 황금이 될 것입니다. –

+0

Out of proc State Server doesn ' 어느 쪽이든, 그것은 직렬화를 역시 필요로한다. IIS가 재활용을 결정하지 않도록 최선을 다하고 있습니다. –

답변

0

여러 세션에서 너무 많은 메모리를 사용했을 때 비슷한 문제가있었습니다. 임계 값에 도달하면 IIS가 임의의 세션을 종료하여 메모리를 확보했습니다. 해결책은 CacheItemPriority.Default에서 CacheItemPriority.NotRemovable로 캐싱을 변경하는 것이 었습니다. 그런 식으로 IIS는 메모리에서 세션을 제거하지 않으며 제한 시간이 지나면 세션이 닫히면 CacheItemRemovedCallback()을 호출하고 메모리에서 제거합니다.

HttpRuntime.Cache.Insert(workbookPath, myWorkbook, Nothing, Cache.NoAbsoluteExpiration, New TimeSpan(0, 0, 1520), CacheItemPriority.NotRemovable, New CacheItemRemovedCallback(AddressOf OnRemoveCallBack)) 
+0

조언을 제공해 주셔서 감사합니다. 지금은 세션 만료 (25 분)까지 클라이언트에서 서버로 주기적으로 폴링을 수행하고 있습니다. 그러나 그것은 시간이 올 때 규모가 조정되지 않습니다. –