OpenXML Sax метод для быстрого экспорта 100K + строк в Excel

Я пытался улучшить производительность метода SAX для записи в xlsx. Я знаю, что в Excel есть ограничение в 1048576 строк. Я достиг этого предела только несколько раз. В большинстве случаев я записываю только от 125К до 250К строк (большой набор данных). Код, который я пробовал, выглядит не так быстро, как мог бы быть из-за того, что он много раз записывает в файл. Я хотел бы надеяться, что кеширование задействовано, но кажется, что в настоящее время слишком много доступа к диску в том, как работает код.

Код ниже похож наИспользование шаблона с OpenXML и SAX потому что я записал в файл с использованием ClosedXML и затем переключился на SAX для большого контента. Память уходит с графиков при попытке использовать ClosedXML для такого количества строк. Вот почему я использую SAX.

        int numCols = dt.Columns.Count;
        int rowCnt = 0;
        //for (curRec = 0; curRec < totalRecs; curRec++)
        foreach (DataRow row in dt.Rows)
        {
            Row xlr = new Row();

            //starting of new row.
            //writer.WriteStartElement(xlr);

            for (int col = 0; col < numCols; ++col)
            {
                Cell cell = new Cell();
                CellValue v = new CellValue(row[col].ToString());

                {
                    string objDataType = row[col].GetType().ToString();
                    if (objDataType.Contains(TypeCode.Int32.ToString()) || objDataType.Contains(TypeCode.Int64.ToString()))
                    {
                        cell.DataType = new EnumValue<CellValues>(CellValues.Number);
                        //cell.CellValue = new CellValue(row[col].ToString());
                        cell.Append(v);
                    }
                    else if (objDataType.Contains(TypeCode.Decimal.ToString()) || objDataType.Contains("Single"))
                    {
                        cell.DataType = new EnumValue<CellValues>(CellValues.Number);
                        cell.Append(v);
                        //TODO: set the decimal qualifier - May be fixed elsewhere
                        cell.StyleIndex = 2;
                    }
                    else
                    {
                        //Add text to text cell
                        cell.DataType = new EnumValue<CellValues>(CellValues.String);
                        cell.Append(v);
                    }
                }

                if (colStyles != null && col < colStyles.Count)
                {
                    cell.StyleIndex = (UInt32Value)colStyles[col];
                }

                //writer.WriteElement(cell);
                xlr.Append(cell);
            }
            writer.WriteElement(xlr);
            //end row element
            //writer.WriteEndElement();
            ++rowCnt;
        }

Этот код очень близок к примерам, которые я видел там. Но проблема в том, что все еще довольно медленно. Переход от записи в отдельную ячейку к добавлению в строку и записи в строку, кажется, улучшил процесс на 10% в строках 125K.

Кто-нибудь нашел способ улучшить писателя или настроить способ писать меньше раз? Существуют ли методы, которые могли бы ускорить этот процесс?

Кто-нибудь пытался настроить какую-либо форму кэширования для повышения производительности?

Ответы на вопрос(2)

Ваш ответ на вопрос