Foreach中的内存异常

时间:2017-05-19 09:06:03

标签: c# .net out-of-memory filestream

我正在尝试创建一个函数来检索所有上传的文件(现在将其保存为数据库中的字节)并将其下载到单个zip文件中。我目前有6000个文件要下载(这个数字可能会增长)。

如果我限制了正在下载的文件数,该功能已经正常工作(从检索到下载),否则,我会在OutOfMemoryException循环中获得ForEach

这是一个伪代码:(文件变量是字节数组和文件名列表)

var files = getAllFilesFromDB(); 
foreach (var file in files) 
{ 
    var tempFilePath = Path.Combine(path, filename);        
    using (FileStream stream = new FileStream(tempfileName, FileMode.Create, FileAccess.ReadWrite))
    {
        stream.Write(file.byteArray, 0, file.byteArray.Length);        
    }
}

private readonly IEntityRepository<File> fileRepository;

IEnumberable<FileModel> getAllFilesFromDb()
{
    return fileRepository.Select(f => new FileModel(){ fileData = f.byteArray, filename = f.fileName});
}

我的问题是,有没有其他方法可以避免此类错误?

1 个答案:

答案 0 :(得分:1)

要避免此问题,您可以避免一次性加载所有文件的所有内容。您很可能需要将数据库调用拆分为两个数据库调用。

  1. 检索所有文件的列表,但不包含其内容但有一些标识符 - 例如表格的PK。
  2. 检索单个文件内容的方法。
  3. 然后你的(伪)代码变成

    get list of all files
    for each file
        get the file contents
        write the file to disk
    

    另一种可能性是改变查询当前的工作方式,以便它使用deferred execution - 这意味着它实际上不会一次加载所有文件,而是从数据库中一次一个地传输它们 - 但是如果没有从您的存储库实现中看到更多代码,我就不能/不会为您猜出正确的解决方案。