Производительность MimeKit Вопрос о MimeMessage.Load - PullRequest
0 голосов
/ 19 марта 2020

В настоящее время я работаю над реализацией поддержки печати для больших файлов MIME, от порога 50 МБ до 2000 МБ, и я проводил некоторые тесты производительности, и я заметил MimeMessage.Load (поток) (это загрузка ) (Stream, CancellationToken) метод) заполняет мою оперативную память очень быстро, и для некоторых платформ, на которых будет работать принтер, это будет sh it.

Сейчас я передаю мой метод Load a NetworkStream, и я прочитал, что использование Load (Stream, Boolean, CancellationToken) может помочь мне с моей проблемой производительности.

Кто-нибудь испытывал то же самое и может объяснить, как работает Load с постоянной работой и как я могу избежать использования слишком большого количества памяти?

Спасибо заранее!

1 Ответ

0 голосов
/ 19 марта 2020

Метод Load(Stream stream, bool persistent, CancellationToken cancellationToken) позволит избежать загрузки содержимого каждого сообщения в ОЗУ , если поток не доступен для поиска.

NetworkStream не доступен для поиска.

Если вы собираетесь загружать сообщения размером 2 ГБ, вам необходимо скопировать содержимое из NetworkStream в FileStream и , затем загрузить сообщение, используя persistent: true.

В MimeKit аргумент persistent сообщает MimeParser, что поток продолжит существовать и будет доступен для чтения после того, как анализатор завершит синтаксический анализ сообщения. Когда MimeParser сообщается об этом, вместо загрузки содержимого сообщения в память, он вместо этого отслеживает смещения потока и создает прокси-объект Stream, который можно использовать для чтения содержимого между начальным и конечным потоком. смещает исходный поток в более поздний момент времени и устанавливает , что на MimeMessage, а не MemoryStream.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...