【发布时间】:2012-01-31 15:45:27
【问题描述】:
因此,这与处理大对象堆和尝试最小化实例化 byte[] 的次数有关。基本上,我遇到了 OutOfMemoryExceptions,我觉得这是因为我们实例化了太多字节数组。当我们处理几个文件时,该程序运行良好,但它需要扩展,目前还不能。
简而言之,我有一个从数据库中提取文档的循环。目前,它一次提取一个文档,然后处理该文档。文档的范围可以从不到 1 兆到 400 多兆。 (因此我一次处理一个)。以下是伪代码,在我优化之前。
所以我正在做的步骤是:
-
调用数据库以找到最大的文件大小(然后将其乘以 1.1)
var maxDataSize = new BiztalkBinariesData().GetMaxFileSize(); maxDataSize = (maxDataSize != null && maxDataSize > 0) ? (long)(maxDataSize * 1.1) : 0; var FileToProcess = new byte[maxDataSize]; -
然后我进行另一个数据库调用,从数据库中提取所有文档(不含数据)并将它们放入 IEnumerable。
UnprocessedDocuments = claimDocumentData.Select(StatusCodes.CurrentStatus.WaitingToBeProcessed); foreach (var currentDocument in UnprocessDocuments) { // all of the following code goes here } -
然后我从外部源填充我的 byte[] 数组:
FileToProcess = new BiztalkBinariesData() .Get(currentDocument.SubmissionSetId, currentDocument.FullFileName); -
问题来了。将 currentDocument (IClaimDocument) 传递给其他方法进行处理会更干净。那么如果我将 currentDocument 的数据部分设置为预先格式化的数组,这会使用现有的引用吗?或者这会在大对象堆中创建一个新数组吗?
currentDocument.Data = FileToProcess; -
在循环结束时,我会清除 FileToProcess
Array.Clear(FileToProcess, 0, FileToProcess.length);
说清楚了吗?如果没有,我会尝试清理它。
【问题讨论】:
-
不要用感情来找出罪魁祸首。使用内存分析器。
-
是
UnprocessedDocuments或其项目实现IDisposable? -
在哪里你得到
OutOfMemoryException?是否有一个相对一致的地方抛出这个异常,或者看起来是随机的? -
UnprocessDocuments is IEnumerable
(IClaimDocument 是一个数据对象(字符串、整数等)。 -
@Cyfer13 - 我想提一下,这是我多年来见过的最好的伪代码。您的问题非常清楚,您提供了足够的信息来理解您所理解的内容,并提供了伪代码,虽然并不完美地解释了您遇到的问题。如果我能给你第二次投票,我会的。
标签: c# asp.net c#-3.0 bytearray out-of-memory