我正在尝试创建一个函数来检索所有上传的文件(现在将其保存为数据库中的字节)并将其下载到单个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});
}
我的问题是,有没有其他方法可以避免此类错误?
答案 0 :(得分:1)
要避免此问题,您可以避免一次性加载所有文件的所有内容。您很可能需要将数据库调用拆分为两个数据库调用。
然后你的(伪)代码变成
get list of all files
for each file
get the file contents
write the file to disk
另一种可能性是改变查询当前的工作方式,以便它使用deferred execution - 这意味着它实际上不会一次加载所有文件,而是从数据库中一次一个地传输它们 - 但是如果没有从您的存储库实现中看到更多代码,我就不能/不会为您猜出正确的解决方案。