byte[] 并通过引用有效传递

2023-11-29

因此,这与处理大对象堆并尝试最小化实例化 byte[] 的次数有关。基本上,我遇到了 OutOfMemoryExceptions,我觉得这是因为我们实例化了太多字节数组。当我们处理几个文件时,该程序运行良好,但它需要扩展,而目前还不能。

简而言之,我有一个从数据库中提取文档的循环。目前,它一次提取一个文档,然后处理该文档。文档的大小可以从小于 1 兆到 400 兆以上。 (这就是为什么我一次处理一个)。以下是我优化之前的伪代码。

所以我正在做的步骤是:

  1. 调用数据库查找最大文件大小(然后乘以 1.1)

    var maxDataSize = new BiztalkBinariesData().GetMaxFileSize();
    maxDataSize = (maxDataSize != null && maxDataSize > 0)
        ? (long)(maxDataSize * 1.1)
        : 0;
    var FileToProcess = new byte[maxDataSize];
    
  2. 然后我进行另一个数据库调用,从数据库中提取所有文档(没有数据)并将它们放入 IEnumerable 中。

    UnprocessedDocuments =
        claimDocumentData.Select(StatusCodes.CurrentStatus.WaitingToBeProcessed);
    foreach (var currentDocument in UnprocessDocuments)
    {
         // all of the following code goes here
    }
    
  3. 然后我从外部源填充我的 byte[] 数组:

    FileToProcess = new BiztalkBinariesData()
        .Get(currentDocument.SubmissionSetId, currentDocument.FullFileName);
    
  4. 这是问题所在。将 currentDocument (IClaimDocument) 传递给其他方法来处理会干净得多。因此,如果我将 currentDocument 的数据部分设置为预先格式化的数组,这会使用现有的引用吗?或者这会在大对象堆中创建一个新数组吗?

    currentDocument.Data = FileToProcess;
    
  5. 在循环结束时,我将清除 FileToProcess

    Array.Clear(FileToProcess, 0, FileToProcess.length);
    

说清楚了吗?如果没有,我会尽力清理它。


Step 1:

var FileToProcess = new byte[maxDataSize];

Step 3:

FileToProcess = new BiztalkBinariesData()
    .Get(currentDocument.SubmissionSetId, currentDocument.FullFileName);

您的步骤 1 完全没有必要,因为您在步骤 3 中重新分配了数组 - 您正在创建一个new数组,您不会填充现有数组 - 因此,本质上,步骤 1 只是为 GC 创建更多工作,如果您以快速顺序执行此操作(并且如果编译器没有优化它,这是完全可能的),则可能会解释这一点您所看到的一些内存压力。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

byte[] 并通过引用有效传递 的相关文章