xlsx에 쓰는 SAX 메서드의 성능을 향상 시키려고했습니다. 엑셀에는 1048576 행의 제한이 있다는 것을 알고 있습니다. 나는이 한계를 단지 몇 번 명중했다. 대부분의 경우 125K에서 250K 행 (큰 데이터 세트) 만 작성합니다. 내가 시도한 코드는 파일에 여러 번 쓰기 때문에 가능한 빠를 것 같지 않습니다. 일부 캐싱이 포함되기를 바랄 것이지만, 코드가 작동하는 방식에 너무 많은 디스크 액세스가있는 것처럼 보입니다.Excel로 100K + 행을 빠르게 내보내는 OpenXML Sax 메서드
아래 코드는 ClosedXML을 사용하여 파일에 기록한 다음 큰 콘텐츠를 SAX로 전환했기 때문에 Using a template with OpenXML and 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;
}
이 코드는 내가 본 일부 예제와 매우 비슷합니다. 그러나 문제는 아직도 느리다는 것이다. 개별 셀 쓰기에서 행 추가 및 행 쓰기로 변경하면 125K 행에서 10 % 씩 프로세스가 향상되었습니다.
글쓴이를 개선하거나 글을 쓰는 방법을 발견 한 사람이 있습니까? 이 프로세스를 가속화 할 수있는 방법이 있습니까?
성능을 향상시키기 위해 캐싱을 설정하려는 사람이 있습니까?
나는 Google 검색에서 발견 된 SAX의 많은 예를 따라 왔습니다. 어떤 이유로 SAX와 DOM이 혼합되어 있습니다. 나는 곧 당신의 해결책을 시도 할 것입니다. – CaptainBli
좋은 시작입니다. 개선 효과는 약 20 %입니다. 125000 행과 44 열에 대한 테스트를 실시했습니다. 완료까지 100 초 이상 걸렸습니다. 125 초가 넘었던 곳입니다. – CaptainBli
그래서 DOM에 대한 다른 참조를 발견하고 특정 코드 (if 문 및 우선 순위 지정)에 몇 가지 다른 알고리즘 개선 사항을 발견했습니다. 이제 47 개에 125K 행이 있습니다.100 초 또는 125 초 대신 3 초. 밀리 세컨드마다 여러 번 반복 할 때 중요합니다. – CaptainBli