2012-03-20 4 views
0

У меня есть приложение с двумя AppDomains. Один из этих AppDomains динамически загружает DLL, которые выполняют некоторые вычисления и производят большой объем выходных данных (хранящихся в EntityFramework EntityObject).Перемещение больших объемов данных между AppDomains

До сих пор я только что возвращал этот EntityObject в другой AppDomain, когда он вызывает соответствующий метод. Конечно, в действительности это сериализует EntityObject и все его данные. По мере того, как количество данных, которые этот объект держится, выросло, этот процесс стал огромным узким местом в приложении (иногда принимал минут для сериализации и десериализации).

Я видел в другом столбце StackOverflow, что MemoryMappedFile может быть решением, но я не уверен в семантике, чтобы сериализовать и десериализовать объект таким образом, и даже если это лучшее решение. Я также видел в другом месте, что перенос в ObjectHandle предположительно позволяет передавать данные в памяти, но это не сработало, когда я его попробовал.

Спасибо за любую помощь.

ответ

1

Как и в случае с this answer, сериализации/десериализации вообще нельзя избежать без большого количества рефакторинга. Если ваша шея бутылки - это ввод-вывод, файлы с отображением памяти могут помочь. Однако, если шея бутылки затрачивает процессорное время на сериализацию и десериализацию, попробуйте использовать более быстрый метод сериализации, такой как Protobuf.Net.

+0

Как перенести данные через AppDomains с помощью этого сериализатора? У вас есть пример? – MgSam

+0

Я знаю, что это старо, но вот новые взгляды на эту проблему. Попытайтесь использовать службы WCF или избавиться от маршалаByObjectRef. В случае WCF вы, вероятно, используете конфигурацию конечных точек named/service/client с двунаправленной связью (я предполагаю, что вы хотите сохранить объекты синхронизации) ... с другой стороны MarshalByObjectRef поддерживается для обратной совместимости, и нет ничего плохого в продолжении использования, и я сомневаюсь, что он будет удален из любой новой платформы .NET. WCF назвал пример труб http://goo.gl/vEo74e и для MarshalByRef http://goo.gl/JdJViR –

Смежные вопросы