减少大对象堆中相同对象的多个副本

7
我正在试图使用HTTPWebRequest将一个大文件(约30MB)的字节上传到某个服务器。问题在于,由于字节数量超过85000,它被存储在大对象堆LOH)中。问题在于,我的代码至少创建了5个相同对象的实例,然后即使关闭响应流之后也无法从内存中移除。以下是导致此问题的代码片段。在此代码块之前,只有一个文件实例位于LOH中。
using (IO.Stream requestStream = webReqest.GetRequestStream())
{
    List<byte> uploadData = new List<byte>();
    uploadData.AddRange(Encoding.UTF8.GetBytes(stringContainingHeaderInfo));
    uploadData.AddRange(bytesOfTheLargeFile);

    byte[] fileFullData = uploadData.ToArray();
    requestStream.Write(fileFullData, 0, fileFullData.Length);
    requestStream.Close();

    uploadData.Clear();
    uploadData = null;
    fileFullData = null;
    fileEntityBytes = null;

   using (WebResponse webResponse = webRequest.GetResponse())
   {
      //Do Something with the response
   }
 }

有没有办法进一步优化这个代码块,以便在堆中创建更少的拷贝?

是的,@RobertHarvey,我正在尝试将它上传到一个在IIS上运行的SharePoint网站。 - Piyush
8
既然您已经在使用流,为什么不在整个过程中都使用流和小型的固定大小缓冲区,而不是将所有数据加载到 byte[] 中? - Damien_The_Unbeliever
2
此外,执行uploadData.Clear(); uploadData = null; fileFullData = null; fileEntityBytes = null;没有任何意义。 - John Saunders
@JohnSaunders实际上,在创建多个副本时,我尝试将不再需要的变量设置为null。但是,你说得对,它们没有任何影响。 - Piyush
1
@Damien_The_Unbeliever 那应该被转化为一个答案。 - ClickRick
显示剩余4条评论
1个回答

1

谢谢提供这些信息。这确实是微软的一个有用的补充。然而,它应该作为最后的选择。即使微软也发出了警告:“LOH压缩可能是一项昂贵的操作,只有在进行了重要的性能分析之后才应该使用,以确定LOH碎片化是一个问题,并决定何时请求压缩。”因此,更好的选择是尽可能避免它。这就是我在这里询问的减少LOH中重复条目的方法。如果LOH中的副本较少,则碎片化将不会成为问题。 - Piyush

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接