Вялікі CSV файл загрузіць у праект ASP.NET MVC

Мне трэба экспартаваць вельмі вялікі CSV-файл (~ 100Мб). У інтэрнэце я знайшоў падобны код і рэалізаваць яго для майго выпадку:

public class CSVExporter
{
    public static void WriteToCSV(List personList)
    {
        string attachment = "attachment; filename=PersonList.csv";
        HttpContext.Current.Response.Clear();
        HttpContext.Current.Response.ClearHeaders();
        HttpContext.Current.Response.ClearContent();
        HttpContext.Current.Response.AddHeader("content-disposition", attachment);
        HttpContext.Current.Response.ContentType = "text/csv";
        HttpContext.Current.Response.AddHeader("Pragma", "public");
        WriteColumnName();
        foreach (Person person in personList)
        {
            WriteUserInfo(person);
        }
        HttpContext.Current.Response.End();
    }

    private static void WriteUserInfo(Person person)
    {
        StringBuilder stringBuilder = new StringBuilder();
        AddComma(person.Name, stringBuilder);
        AddComma(person.Family, stringBuilder);
        AddComma(person.Age.ToString(), stringBuilder);
        AddComma(string.Format("{0:C2}", person.Salary), stringBuilder);
        HttpContext.Current.Response.Write(stringBuilder.ToString());
        HttpContext.Current.Response.Write(Environment.NewLine);
    }

    private static void AddComma(string value, StringBuilder stringBuilder)
    {
        stringBuilder.Append(value.Replace(',', ' '));
        stringBuilder.Append(", ");
    }

    private static void WriteColumnName()
    {
        string columnNames = "Name, Family, Age, Salary";
        HttpContext.Current.Response.Write(columnNames);
        HttpContext.Current.Response.Write(Environment.NewLine);
    }
}

Праблема заключаецца ў тым, я хачу, каб пачаць загрузку да (!) Увесь CSV будуецца. Чаму гэта не працуе, як я таксама мяркую, гэта і тое, што я павінен змяніць?

1
Калі вы вырашылі гэтую праблему, вы можаце прадаставіць канчатковы код?
дададзена аўтар sports, крыніца
Мне цікава, куды вы кладзе гэта ў рамках MVC? Вы проста выклічце метад WriteToCSV() ад дзеяння?
дададзена аўтар Neil N, крыніца
Два хуткіх каментарыяў: перайсці ў IEnumerable і пазбегнуць папярэдняга запаўнення спісу (для вываду 100MB ён, хутчэй за ўсё, мае шмат запісаў), і прамыйце выхадны водгук кожныя 1000 радкоў або каля таго.
дададзена аўтар Morten Mertner, крыніца
@Morten Mertner, ды, дзякуй, я ўжо гэта зрабіць, гэта быў знойдзены ўзор I на аснове кода на
дададзена аўтар Yurii Hohan, крыніца

1 адказы

Вы маглі б прымусіць рэакцыю быць выгружаны на кліенце з дапамогай

Response.Flush();

пасля кожнага запісу дадаецца да патока. Калі ласка, звярніцеся да гэтай артыкуле для атрымання больш падрабязнай інфармацыі:

http://support.microsoft.com/kb/812406

4
дададзена
Магчыма, трохі больш эфектыўна прамываць праз кожныя 50 або 100 запісаў або каля таго, не кожны адзін.
дададзена аўтар Neil N, крыніца
Праўда, upvoted Ваш каментар.
дададзена аўтар Wiktor Zychla, крыніца
так, гэта працуе выдатна, дзякуй
дададзена аўтар Yurii Hohan, крыніца