При попытке экспортировать данные в Excel (1.000.000 записей) в веб-API и Angular, потоковая запись создает исключение нехватки памяти - PullRequest
0 голосов
/ 28 ноября 2018

При попытке экспортировать данные в Excel (1.000.000 записей) в Web API и Angular, потоковая запись приводит к исключению нехватки памяти.

Пробное разделение таблиц данных со 100.000 записями в каждой и запись потока отдельно.Однако, когда я пытаюсь объединить поток, происходит Out Of Memory Exception.

Возможно ли когда-либо экспортировать 1.000.000 записей в листе Excel.Я могу экспортировать до 175 000 записей.Но требуют 1.000.000.См. Фрагмент ниже.

    [HttpPost]
    public HttpResponseMessage DownloadExcel([FromBody]AuditRequest auditRequest)
    {
        HttpResponseMessage result = Request.CreateResponse(HttpStatusCode.OK);
        var response = GetAuditForDownload(auditRequest);
        MemoryStream streamFinal = new MemoryStream();
        List<AuditRequest> auditListForBulk = new List<AuditRequest>();
        foreach (AuditRequest req in response.Data)
        {
            req.FromDate = auditRequest.FromDate;
            req.ToDate = auditRequest.ToDate;
        }

        DataTable table = ConvertToDataTable(response.Data);          
        List<DataTable> splittedtables = table.AsEnumerable()
                                    .Select((row, index) => new { row, index })
                                    .GroupBy(x => x.index / 100000)  //integer division, the fractional part is truncated
                                    .Select(g => g.Select(x => x.row).CopyToDataTable())
                                    .ToList();

        splittedtables.ForEach(delegate (DataTable SplitTable)
        {
            MemoryStream stream = new MemoryStream();
            StreamWriter writer = new StreamWriter(stream);
            writer.Write(ToCSV(SplitTable).ToString());
            writer.Flush();
            stream.Position = 0;
            stream.CopyTo(streamFinal);
            //byteArray = GetBytesFromDataSet(SplitTable);
            //byteArrayFinal = byteArrayFinal.Concat(byteArray).ToArray();
        });



        result = new HttpResponseMessage(HttpStatusCode.OK) { Content = new ByteArrayContent(streamFinal.ToArray()) };
        result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
        result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
        {
            FileName = "File.csv"
        };

        return result;
    }
...