【问题标题】:MimeKit Performance Question about MimeMessage.Load关于 MimeMessage.Load 的 MimeKit 性能问题
【发布时间】:2020-06-30 09:14:32
【问题描述】:

我目前正在努力实现对更大 MIME 文件的打印支持,从 50MB 阈值到 2000MB,我正在做一些性能测试,我注意到 MimeMessage.Load(stream)(这是 Load(Stream, CancellationToken) 方法) 正在快速填充我的 RAM 内存,并且对于打印机将运行的某些平台,这会使它崩溃。

现在我正在向我的 Load 方法提供 NetworkStream,我读到使用 Load(Stream, Boolean, CancellationToken) 可以帮助我解决性能问题。

有没有人有同样的经历,也许可以解释一下 Load 是如何持续工作的,以及我如何避免使用过多的内存?

提前谢谢你!

【问题讨论】:

    标签: c# mimekit


    【解决方案1】:

    Load(Stream stream, bool persistent, CancellationToken cancellationToken) 方法将避免将每条消息的内容加载到 RAM 中除非流不可搜索。

    NetworkStream 不可搜索。

    如果您要加载大小为 2GB 的消息,您需要将内容从 NetworkStream 复制到 FileStream然后使用 persistent: true 加载消息。

    在 MimeKit 中,persistent 参数告诉MimeParser,流将继续存在并且在解析器完成解析消息后可读。当MimeParser 被告知这一点时,它不会将消息的内容加载到内存中,而是跟踪流偏移并创建一个代理Stream 对象,该对象可用于读取开始和结束流之间的内容原始流在稍后时间点的偏移量,并将 that 设置为 MimeMessage 而不是 MemoryStream

    【讨论】:

    • 只有 1 个问题,在我将网络流中的内容复制到文件流之后,我是否必须提供给 MimeMessage。将文件路径作为字符串加载,或者它应该与FileStream 对象也一样吗?
    • 你可以使用FileStream
    • 这是我尝试过的,但由于某种原因,我在加载时收到了 FormatException。我正在做的是创建一个 FileStream,然后使用 CopyTo 从我的 inputStream 复制内容。我还不知道为什么它失败了。难道是因为FileStream没有关闭?
    • 你把FileStream的位置设置回0了吗?似乎没有人记得这样做。
    猜你喜欢
    • 2011-05-28
    • 1970-01-01
    • 2022-09-24
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    • 2013-03-23
    • 1970-01-01
    • 2017-10-30
    相关资源
    最近更新 更多