现在,我有一个api,它可以获取许多结果(800k),它应该将其解析为CSV并将其作为流传输。我拥有的(某种)工作代码是这个
var query = context.address.AsNoTracking(); MemoryStream memoryStream = new MemoryStream(); StreamWriter writer = new StreamWriter(memoryStream); foreach (var row in query) { writer.WriteLine(row.Name+","+row.Surname+","+row.BirthDate); } writer.Flush(); memoryStream.Seek(0, SeekOrigin.Begin); return new FileStreamResult(memoryStream, "application/octet-stream") { FileDownloadName = "DataFile.csv" };
然而,这似乎将所有内容都放入了内存,并使用了300 mb的内存进行存储。据我了解,这发生在foreach语句中。有没有一种方法,我可以写线,将其流化,然后从内存中处理掉?我的目标是在不使用大量内存的情况下实现与此类似的操作
我也尝试过这种方法,这种方法适用于一个电话,但是如果同时进行多个api调用,则会出现奇怪的行为
public async Task makeDif() { //var query = context.Adresar.AsNoTracking(); var query = context.Adresar.Select(x => string.Join(",", x.Ime, x.Prezime, x.Datarag + Environment.NewLine)).AsNoTracking(); Response.ContentType = "application/json"; Response.BodyWriter.WriteAsync(Encoding.UTF8.GetBytes("ime,prezime,datarag" + Environment.NewLine)); foreach (var row in query) { await Response.BodyWriter.WriteAsync(Encoding.UTF8.GetBytes(row)); }}
现在,我有一个api,它可以获取许多结果(800k),它应该将其解析为CSV并将其作为流传输。我拥有的(某种)工作代码是这个var query = context.address.AsNoTracking(); ...
您可以将数据直接写入响应正文,而无需将其放入MemoryStream。