2012-03-20 2 views
0

두 개의 AppDomains가있는 응용 프로그램이 있습니다. 이러한 AppDomains 중 하나는 일부 계산을 수행하고 많은 양의 출력 데이터 (EntityFramework EntityObject에 저장 됨)를 생성하는 DLL을 동적으로로드합니다.AppDomain간에 많은 양의 데이터 이동

지금까지 적절한 메소드를 호출 할 때이 EntityObject를 다른 AppDomain으로 "반환"했습니다. 물론 실제로는 EntityObject와 모든 데이터를 직렬화합니다. 이 객체가 보유하는 데이터의 양이 늘어남에 따라이 프로세스는 응용 프로그램에서 커다란 병목 현상이되었습니다 (때때로 을 사용하여 직렬화 및 비 직렬화).

MemoryMappedFile이 해결책이 될 수있는 다른 StackOverflow 게시물을 보았습니다. 그러나이 방법으로 객체를 직렬화 및 비 직렬화하는 의미가 확실하지 않으며 이것이 최선의 해결책 인 경우에도 마찬가지입니다. ObjectHandle에 랩핑하면 데이터를 메모리에서 공유 할 수 있지만, 시도 할 때 작동하지 않는다는 것을 다른 곳에서도 보았습니다.

도움 주셔서 감사합니다.

답변

1

this answer과 같이 일반적으로 많은 리팩토링 없이는 직렬화/직렬화를 피할 수 없습니다. 병 목이 I/O 인 경우 메모리 매핑 된 파일이 도움이 될 수 있습니다. 그러나 병 목이 직렬화 및 비 직렬화에 소비 된 CPU 시간 인 경우 Protobuf.Net과 같은 더 빠른 직렬화 방법을 사용해보십시오.

+0

이 serializer를 사용하여 AppDomains에서 데이터를 이동하려면 어떻게해야합니까? 모범이 있습니까? – MgSam

+0

나는 이것이 오래되었음을 알고 있지만, 여기에이 문제에 대한 새로운 시각이있다. WCF 서비스를 사용하거나 잘못된 MarshalByObjectRef를 사용하십시오. WCF의 경우에는 양방향 통신을 사용하여 명명 된 파이프 서비스/클라이언트 끝점 구성을 사용할 수 있습니다 (동기화 개체를 유지하려고한다고 가정합니다 ...). 반면에 MarshalByObjectRef는 이전 버전과의 호환성을 위해 보관되며 잘못된 사용은 없습니다. 새로운 .NET 프레임 워크에서 제거되지는 않을 것입니다. WCF 명명 된 파이프 예 http://goo.gl/vEo74e 및 MarshalByRef http://goo.gl/JdJViR –

관련 문제