Maystyle :
Admin : New post
Guestbook
Local
media
Catergories
Recent Articles
Recent Comments
Recent Trackbacks
Calendar
Tag
Archive
Link
Search
 
  DotNet Remoting 에서 아주 큰 데이터셋을 이용할때 발생하는 OutOfMemoryExceptions 
작성일시 : 2010. 10. 19. 16:20 | 분류 : Technical Note (2008)/Development

최근에 흥미로운 일을 좀 진행 했습니다.
http://blogs.msdn.com/b/tess/archive/2008/09/02/outofmemoryexceptions-while-remoting-very-large-datasets.aspx

위의 문서에서 보듯이 .net Remoting을 통해 100M 정도의 데이터 셋을 Serialization을 하는데는 1G의 공간이 필요하다고 합니다. 물론 XML 타입으로 Serialization을 했기 때문이죠.

원래 XML은 Stateful 과 StateLess 타입이 있다고 합니다. 변경과 관련된 관리 정보를 저장하기 위해서죠. ( Anyway 기본적으로 XML 타입으로 Serialization을 하게 되면 Stuteful 이 됩니다. 그렇게 되면 데이터의 크기가 더 커지겠죠. 그리고 그와 더불어 이 XML 타입을 사용하는 경우 내부적으로 많은 Short lived 객체들을 사용하게 된다 던지 하는 등의 성능에 좋지 못한 영향을 끼칠 수 있는 문제들을 많이 발생 시킨다고 합니다. 이는 XML을 사용해서 문제가 되는 것이 아니라 XML 타입을 사용하지 않아도 되는 곳에 XML 타입을 사용했기 때문에 문제가 되는 것 입니다.
출처 : http://msdn.microsoft.com/en-us/magazine/cc163911.aspx

결론적으로 .net remoting을 통해 단순히 DB 조회 데이터를 가져온다면 Binary Type을 이용하는 것이 훨씬 효과적이라는 것입니다.

image

Binary 타입으로 Serialization을 하기 위해서는 Dataset을 리턴 하기 전에 한 줄만 추가해 주면 된다고 하네요.
ds.RemotingFormat = SerializationFormat.Binary;

그리고 한 가지 더 OOM은 물론 해당 프로세스의 메모리 사용량이 많아 졌을 때도 발생하지만 필요한 메모리를 할당하지 못했을 때 즉 Serialization을 하기 위해서는 1개의 큰 메모리 공간이 필요한데, 이미 다른 이유로 인해 메모리 단편화가 많이 발생하거나 32bit의 한계인 2G를 초과하는 메모리 할당이 필요 했다면 역시 OOM이 발생 합니다.

후자의 예만 잠시 들자면 VM 사이즈가 1.4G인 프로세스에서 100M의 dataset을 Serialization 하기 위해서는 약 1G의 메모리 공간이 필요합니다. 하지만 이렇게 1G의 메모리 공간을 추가로 할당하게 되면 VM 사이즈가 2G를 넘어서기 때문에 할당에 실패할 수 밖에 없습니다. 이 경우 OOM이 발생하게 되는 것이죠,

|