gpt4 book ai didi

c# - XmlMtomReader读取策略

转载 作者:行者123 更新时间:2023-11-30 22:48:47 28 4
gpt4 key购买 nike

考虑以下代码:

Stream stream = GetStreamFromSomewhere(); 
XmlDictionaryReader mtomReader =XmlDictionaryReader.CreateMtomReader
(
stream,
Encoding.UTF8,
XmlDictionaryReaderQuoatas.Max
);

/// ...

/// is there best way to read binary data from mtomReader's element??
string elementString = mtomReader.XmlReader.ReadElementString();
byte[] elementBytes = Covert.FromBase64String(elementString);
Stream elementFileStream = new FileStream(tempFileLocation);
elementFileStream.Write(elementBytes,0,elementBytes.Length);
elementFileStream.Close();

/// ...

mtomReader.Close();

问题是二进制附件的大小有时会超过 100Mb。有没有办法逐 block 读取元素的二进制附件,然后将其写入临时文件流,这样我就可以避免为空洞的东西分配内存?

第二个 - 甚至更具体的问题 - 在我读取元素的内容之前,mtomReader 是否创建 mime 二进制附件的任何内部缓存,即为二进制数据分配内存?还是直接从输入流中读取字节?

最佳答案

对于那些可能对解决方案感兴趣的人:

using (Stream stream = GetStreamFromSomewhere())
{
using (
XmlDictionaryReader mtomReader = XmlDictionaryReader.CreateMtomReader(
stream, Encoding.UTF8, XmlDictionaryReaderQuotas.Max))
{
string elementString = mtomReader.ReadElementString();
byte[] buffer = new byte[1024];
using (
Stream elementFileStream =
new FileStream(tempFileLocation, FileMode.Create))
{
while(mtomReader.XmlReader.ReadElementContentAsBase64(buffer,0,buffer.Length)
{
elementFileStream.Write(buffer, 0, buffer.Length);
}
}

/// ...

mtomReader.Close();
}
}

ReadElementContentAsBase64(...) 帮助逐 block 读取二进制部分。我的帖子的第二期在这里得到了完美的涵盖:Does XmlMtomReader cache binary data from the input stream internally?

关于c# - XmlMtomReader读取策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1500287/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com