如何降低FileStreamResult API中的内存使用率 [英] How to lower memory usage in FileStreamResult api

查看:42
本文介绍了如何降低FileStreamResult API中的内存使用率的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

现在,我有一个api,它可以获取许多结果(800k),并且应该将其解析为CSV并将其流式传输.我拥有的(某种)工作代码是这个

Right now I have an api that gets many results (800k) and it should parse and stream them as CSV. The (kind of) working code I have is this

            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语句中.有没有一种方法,我可以编写该行,将其流化,然后从内存中处理掉?我的目标是在不使用大量内存的情况下实现与此类似的功能

However this seems to put everything into memory, and store it using up 300 mb of memory. As i understand it, that happens in the foreach statement. Is there a way that i write the line, stream it, and then dispose of it from memory? My goal is to achieve something similar to this without using so much memory

我也尝试过这种方法,这种方法适用于一个电话,但是如果同时进行多个api调用,则会出现奇怪的行为

I have also tried it this way, which works for one call, but if multiple api calls are made at the same time, there is weird behaviour

 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));

            }}

推荐答案

您可以将数据直接写入响应正文,而无需将其放入MemoryStream.

You can write data directly to response body without need of putting it into a MemoryStream.

询问者这就是我所做的

//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));
}

似乎工作正常

这篇关于如何降低FileStreamResult API中的内存使用率的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆