带有FileStreams的MimeKit迭代器

问题描述 投票:0回答:1

我刚刚设法重写了一些代码,现在应该可以处理用于打印的大型MIME文件。

为此,我们以以下方式使用了MimeKit:

        var message = MimeMessage.Load(_fileStream, true);
        var iter = new MimeIterator(message);
        while (iter.MoveNext())
        {
        ...
        }

这里有趣的是,在我使用fileStream之前,我们曾经复制了一个HttpListenerRequest对象的inputStream,该对象是无法加载到MimeKit的NetworkStream(不可搜索)。

自添加fileStream以来,对于2GB的作业,我在while循环内花了大约40秒的时间来遍历请求的每个部分,如果您问我……用memoryStream则是6秒。

此行为正常吗?是否有机会通过MimeKit获得更好的时光,还是我应该实现自己的解析器?

提前感谢!

c# filestream mime mimekit
1个回答
0
投票

这里有趣的是,在我使用fileStream之前,我们曾经复制了一个HttpListenerRequest对象的inputStream,该对象是无法加载到MimeKit的NetworkStream(不可搜索)。

我不太确定你在上面的意思。你在做这样的事情吗?

var memory = new MemoryStream ();
httpResponse.Stream.CopyTo (memory);
memory.Position = 0;
var message = MimeMessage.Load(memory, true);

自添加fileStream以来,对于2GB的作业,我在while循环内花了大约40秒的时间来遍历请求的每个部分,如果您问我……用memoryStream则是6秒。

您对MimeMessage.Load()的使用将true作为persistent参数传递。这提高了[[parsing性能(因为它不再需要在解析后将MIME内容加载到RAM中),但是对以后读取单个MIME部分的内容的性能产生负面影响,因为它需要寻求_fileStream的起始偏移量您要求的每个MIME部分的内容。

此行为正常吗?

40秒似乎很多,但是在不了解您的代码更多细节的情况下,我无法提出任何建议。

是否有机会通过MimeKit获得更好的体验,或者我应该实现自己的解析器?

[我可以保证,如果您实现自己的解析器,它将比MimeKit慢几个数量级(这实际上是每一次在C#中编写MIME解析器的尝试都比MimeKit慢几个数量级); -)

这里您需要做的是在探查器下运行代码以查看问题所在。

如果性能问题如您在循环内所建议的那样,则在解析器中不是性能问题。这是循环中的性能问题。这并不是说MimeKit代码不会在缓慢中发挥作用。

如果问题出在MimeKit中,我会怀疑BoundStream.Read()中的此逻辑:

// make sure that the source stream is in the expected position if (BaseStream.Position != StartBoundary + position) BaseStream.Seek (StartBoundary + position, SeekOrigin.Begin);

在您的情况下,BaseStream应该是您的_fileStream。自从我看过FileStream.Position的代码以来已经有一段时间了,但是它

may

需要系统调用才能获取该值(并且系统调用并非免费)。不过40秒是很多时间-比我期望的要多得多,除非每个MIME部分的内容都很大(MimePart的流内容。每个循环的内容将读取〜4K,并且如果每个循环有1个lseek() ,可以加起来)。

希望可以帮助您解决这一问题。

© www.soinside.com 2019 - 2024. All rights reserved.