ボタンが付いたページがあります。クリックすると、テーブルから539,200行を取り出して、OpenXML SDKでExcelファイルを作成しています。 WebClient.UploadFileメソッドを使用してFTPにアップロードする50MB以上のファイルを作成します。このプロセス全体では、IISワーカープロセスのCPU使用率は30%になり、メモリ使用率は1.2GBになります。全プロセスは私のサーバーで完了するのに約10分かかります。完了後、ブラウザ(Firefox)でさらに10分かかると、「接続がリセットされました」というエラーが表示されます。以前の実行完了前の10分後に、ログで別の実行が開始されたことがわかりました。私は誰もそのサーバーを使用していないと確信しています。C# - ブラウザが重複要求を送信していて、長時間実行されているプロセスでエラー接続がリセットされました。
私の質問
プロセスが完了した後にメモリ使用率がダウンして来なかったのはなぜ?私は慎重にそれぞれのオブジェクトごとに&を配置しました。ガベージコレクタと呼ばえさえ。メモリを解放するためにIISを再起動する必要がありました。コードで何ができますか?
私のログごとに、合計実行は10分で終了しましたが、ブラウザは応答せず、「接続中.....」と表示され続けました。さらに10分後に「接続がリセットされました」というエラーが表示されました。何が悪かったのか?
前回終了前に別の実行ログが表示されたのはなぜですか?ブラウザが別のリクエストを送信していますか、IIS/ASP.Netが狂っていますか?
実行時にAjaxリクエストを使用すると、IISを再起動するまで10分ごとにログエントリが繰り返されていました。何が起こった?
繰り返しログエントリは、同じプロセスが繰り返し実行されることを意味します。今私は怒っている。
私はデータ
Function fun = new Function();
List<SqlParameter> para = new List<SqlParameter>();
para.Add(new SqlParameter() { ParameterName = "@IDs", SqlDbType = SqlDbType.NVarChar, Size = 4000, Value = "something" });
para.Add(new SqlParameter() { ParameterName = "@Fromdate", SqlDbType = SqlDbType.Date, Value = "2017-06-01" });
para.Add(new SqlParameter() { ParameterName = "@Todate", SqlDbType = SqlDbType.Date, Value = "2017-06-27" });
dsExcel = fun.GetDataSet("sp_GetData", para);
(ピボットテーブル付き)Excelへのエクスポート
private bool ExportDSToExcel(string destination)
{
LogUtil.LogInfo("Writing excel with rows: " + dsExcel.Tables[0].Rows.Count);
try
{
using (var spreadsheet = SpreadsheetDocument.Open(destination, true))
{
foreach (DataTable table in dsExcel.Tables)
{
WorkbookPart workbookPart = spreadsheet.WorkbookPart;
WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();
string origninalSheetId = workbookPart.GetIdOfPart(worksheetPart);
WorksheetPart replacementPart =
workbookPart.AddNewPart<WorksheetPart>();
string replacementPartId = workbookPart.GetIdOfPart(replacementPart);
DocumentFormat.OpenXml.OpenXmlReader reader = DocumentFormat.OpenXml.OpenXmlReader.Create(worksheetPart);
DocumentFormat.OpenXml.OpenXmlWriter writer = DocumentFormat.OpenXml.OpenXmlWriter.Create(replacementPart);
while (reader.Read())
{
if (reader.ElementType == typeof(SheetData))
{
if (reader.IsEndElement)
continue;
writer.WriteStartElement(new SheetData());
DocumentFormat.OpenXml.Spreadsheet.Row headerRow = new DocumentFormat.OpenXml.Spreadsheet.Row();
writer.WriteStartElement(headerRow);
List<String> columns = new List<string>();
foreach (DataColumn column in table.Columns)
{
columns.Add(column.ColumnName);
Cell cell = new Cell();
cell.DataType = CellValues.String;
cell.CellValue = new CellValue(column.ColumnName);
writer.WriteElement(cell);
}
//End Row element writing
writer.WriteEndElement();
foreach (DataRow dsrow in table.Rows)
{
DocumentFormat.OpenXml.Spreadsheet.Row newRow = new DocumentFormat.OpenXml.Spreadsheet.Row();
writer.WriteStartElement(newRow);
foreach (String col in columns)
{
Cell cell = new Cell();
if ((dsrow[col].GetType().ToString().Contains(TypeCode.Int32.ToString()) || (dsrow[col].GetType().ToString().Contains(TypeCode.Decimal.ToString())) || (dsrow[col].GetType().ToString().Contains(TypeCode.Int64.ToString()))))
{
cell.DataType = CellValues.Number;
}
else
{
cell.DataType = CellValues.String;
}
cell.CellValue = new CellValue(dsrow[col].ToString()); //
writer.WriteElement(cell);
}
writer.WriteEndElement();
}
//End SheetData writing
writer.WriteEndElement();
}
else
{
if (reader.IsStartElement)
{
writer.WriteStartElement(reader);
}
else if (reader.IsEndElement)
{
writer.WriteEndElement();
}
}
}
reader.Close();
reader.Dispose();
writer.Close();
writer.Dispose();
Sheet sheet = workbookPart.Workbook.Descendants<Sheet>()
.Where(s => s.Id.Value.Equals(origninalSheetId)).First();
sheet.Id.Value = replacementPartId;
workbookPart.DeletePart(worksheetPart);
}
PivotTableCacheDefinitionPart ptp = spreadsheet.WorkbookPart.PivotTableCacheDefinitionParts.First();
ptp.PivotCacheDefinition.RefreshOnLoad = true;
ptp.PivotCacheDefinition.RecordCount = Convert.ToUInt32(dsExcel.Tables[0].Rows.Count); ptp.PivotCacheDefinition.CacheSource.WorksheetSource.Reference = "A1:" + IntToLetters(dsExcel.Tables[0].Columns.Count) + (dsExcel.Tables[0].Rows.Count + 1); ptp.PivotTableCacheRecordsPart.PivotCacheRecords.RemoveAllChildren();
ptp.PivotTableCacheRecordsPart.PivotCacheRecords.Count = 0;
spreadsheet.Save();
spreadsheet.Close();
spreadsheet.Dispose();
//GC.Collect();
//GC.WaitForPendingFinalizers();
}
LogUtil.LogInfo("Wrote excel");
return true;
}
catch (Exception ex)
{
return false;
}
}
を取得するには、編集 IIS 8
で
をのWindows Server 2012を使用していますFTPにアップロード
public void UploadFileToFtp(string file)
{
FileInfo fileInfo = new FileInfo(file);
using (WebClient client = new WebClient())
{
client.Credentials = ftpNetworkCredentials;
client.UploadFile(ftpUri + fileInfo.Name, "STOR", file);
client.Dispose();
}
LogUtil.LogInfo(file + " uploaded successfully");
}
ボタンのClickイベントのコード
protected void btnSubmit_Click(object sender, EventArgs e)
{
LogUtil.LogInfo("Getting data");
FillReportTable();
LogUtil.LogInfo("File upload is disabled");
string IOPath = Server.MapPath("~/Report-" + DateTime.Now.ToString("MM-dd-yyyy-hh-mm-ss") + ".xlsx");
if (System.IO.File.Exists(IOPath))
{
System.IO.File.Delete(IOPath);
}
System.IO.File.Copy(Server.MapPath("~/TempReport.xlsx"), IOPath);
ExportDSToExcel(IOPath);
if (Convert.ToBoolean(ConfigurationManager.AppSettings["ftpUpload"].ToString()))
{
UploadToFTP(IOPath);
}
else
{
LogUtil.LogInfo("File upload is disabled");
}
lblMessage.Text = "File uploaded successfully";
}
サーバは、ブラウザは、すべての10分後にリクエストを送信し続けるので、どちらかの前の要求を終了する前に、実行を繰り返しているので、メモリの使用率が下がってきていないように思えます。私はバイリンガルでチェックしたが、ログにはポーリングコールがあふれていた。徹底的にチェックできませんでした。 同じサーバー上でページにアクセスすると、同じコードで同じ時間がかかり、正常に動作します。インターネット上で同じことをしたときに問題を生み出します。私は仕事で10mbpsの接続を持ち、AzureのクラウドではVMを持っています。
メモリの問題を解決する方法を提案してください。私は狂っていると感じています。過去16時間からこれに取り組んでいます。 –
答えの最後に新しいコメントが追加されました。一言で言えば、これを行うことができれば、すべてのコストでExcelを使用しないようにしてください。代わりにCSVのようなことをしてみてください。いずれの場合も、すべての操作を別のクラスに移動し、タスク内でそのクラスをインスタンス化します。タスクが完了すると、クラスはスコープから外れて、ガベージコレクション時に解放されます。完了後、必要に応じてすべてを手動でクリーンアップすることもできます。 –
ブラウザやブラウザからの複数のリクエストが応答なしで複数のリクエストを送信しているような、繰り返しの実行の理由は何ですか?ちょうど私の知識のために。 –