2008-10-23 3 views
2

Scott Hanselman은 최근 세션/캐시에 저장된 문자열을 압축하는 방법을 설명하는 blog article을 게시했습니다. 이것은 상당히 유망 해 보이지만, 세션/캐시에 저장하는 데이터의 대부분은 문자열이 아니라 사용자 정의 클래스입니다. 어떻게 압축하면됩니까?세션/캐시에 저장된 객체를 어떻게 압축합니까?

처음에는 BinaryFormatter를 사용하여 개체를 먼저 serialize하고 (ASP.NET 프레임 워크가 세션/캐시에 사용자 지정 클래스 개체를 저장할 때 정상적으로 수행하는 것처럼) 결과 바이트 배열을 압축합니다. 그러나 이것은 세션/캐시에서 검색된 데이터가 읽기 전용이된다는 부작용을 가지고 있습니다 (압축 해제 및 비 직렬화는 새로운 메모리 내 객체를 생성하므로).

즉, 내 코드가 현재 다음과 같이 보이면 저장소를 세션에 압축하는 방법이 있습니까?

MyClass foo = new MyClass(); 
Session["foo"] = foo; 

MyClass retrievedFoo1 = (MyClass) Session["foo"]; 
retrievedFoo1.Property1 = "property 1"; 

// retrievedFoo2.Property1 should equal "property 1"! 
MyClass retrievedFoo2 = (MyClass) Session["foo"]; 
+0

세션에 저장된 개체는 프로세스 외부에 저장되어있는 경우 (예 : SQL Server에 저장되어있는 경우)에만 이진 serializer로 직렬화됩니다. –

+0

좋아, 그렇다면 SQL 서버에 저장하기 전에 데이터를 어떻게 압축합니까? –

+0

SQL 서버에 데이터를 저장하는 경우 왜 실제로 압축해야합니까? – jmcd

답변

0

XML 직렬 변환기를 사용하여 XML 형식으로 변환 할 수 있습니까?

+0

자세한 내용은 http://www.dotnetjohn.com/articles.aspx?articleid=173을 참조하십시오. –

+0

그럴 수는 있지만, 목적을 무력화시킬 수는 있습니다. XML 직렬화는 이진 직렬화보다 더 큰 오브젝트를 생성합니다. XML이 압축 된 후에도 ASP.NET 프레임 워크가 수행하는 기본 이진 직렬화보다 작은 풋 프린트를 가지는지 의심 스럽습니다. –

0

세션의 오버로드로 인한 성능 저하는 저장 장치 크기가 아닌 직렬화/직렬화 해제의 오버 헤드 때문에 발생합니다. 성능 문제를 해결하기 위해 압축을보고 있다면 잘못된 길로 가려고 생각합니다. (De) Compression은 오버 헤드를 추가합니다.

이제 캐시에 대해 이야기하고 있다면, 상황이 조금 다릅니다. 하지만 구체적으로 세션을 언급 ...


Scott의 기사에 대한 귀하의 의견을 읽는 중 혼란스러워합니다. Session/Cache에 데이터를 저장하거나 파일에 기록하는 것과 같은 방식으로 데이터 지속성을 얻는 것을 이해하지 못하는 것 같습니다. 압축은 당신이 요구하는 것을 풀지 않을 것입니다.

1

먼저 세션/캐시의 데이터를 압축해야하는 이유를 먼저 살펴 보겠습니다. 압축은 최후의 수단이되어야하며, 더 나은 프로그래밍이 첫 번째가되어야합니다.

메모리가 부족합니까? 그렇다면 어떤 개체가 가장 많이 소모됩니까? 이렇게하면 사용 된 메모리 양을 줄이기 위해 코드 개선 방향을 알려야합니다.

앱이 필요한 객체를 최대한 활용하여 최적화 된 경우 데이터베이스 또는 파일 시스템과 같은 메모리 저장 공간을 살펴보다 큰 객체 (직렬화가 편리한 위치)를 캐싱 할 수 있습니다.

확장 성을 높이고 웹 팜을 통해 사이트를 배포하기 위해 다른 서버에 InProc 세션을 웹 서버에 배치 할 수도 있습니다.

관련 문제