[英]Out of memory exception when pulling huge data from DB
我們正在從SQL Server數據庫中提取大量數據。 它具有大約25000行和2500列。 要求是讀取數據並將其導出到電子表格,因此無法選擇分頁。 當記錄較少時,它能夠拉出數據,但是當記錄增加到我上面提到的大小時,它將引發異常。
public DataSet Exportexcel(string Username)
{
Database db = DatabaseFactory.CreateDatabase(Config);
DbCommand dbCommand =
db.GetStoredProcCommand("Sp_ExportADExcel");
db.AddInParameter(dbCommand, "@Username", DbType.String,
Username);
return db.ExecuteDataSet(dbCommand);
}
請幫助我解決此問題。
要求是讀取數據並將其導出到電子表格,因此無法選擇分頁。
為什么不分步讀取數據。 與其一次獲取所有記錄,不如每次都獲取有限數量的記錄並將其寫入excel。 繼續直到您處理完所有記錄
您可以使用批處理邏輯來批量獲取記錄,例如每次執行5000條記錄,並將結果存儲在臨時數據集中,一旦完成所有處理。 將數據從臨時數據集轉儲到excel。
為此,可以使用C#BulkCopy類。
如果足以將數據作為csv在Excel中提供,則可以使用批量復制
bcp "select col1, col2, col3 from database.schema.SomeTable" queryout "c:\MyData.txt" -c -t"," -r"\n" -S ServerName -T
這是變態更快,並且幾乎沒有占用空間。
您的問題完全取決於您試圖一次性提取這么多數據的事實。 您可以通過在執行查詢的機器上安裝更多內存來解決此問題,但這只是一個難題。
最好分步檢索此類數據。
您可以很容易地逐行讀取數據並將其以CSV格式導出/追加到文件中,而所有這些操作都可以在存儲過程中完成。
您沒有說要使用什么數據庫,但是數據庫引擎要處理的是處理如此大量的數據。
除此之外,在用C#代碼處理大量數據對象時,最好考慮使用泛型,因為這不會像類那樣強加對象實例化,從而減少了內存占用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.