簡體   English   中英

從數據庫中提取大量數據時出現內存不足異常

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM