簡體   English   中英

如果可能,使用 Ado.NET 適配器減少 Memory 占用空間

[英]Reduce Memory footprint if possible using Ado.NET Adapter

我需要將移動數據庫與主數據庫同步。 思路如下。 我有一個 REST 服務,它接受輸入我需要同步的表的名稱(使用 DateTime,因為下次交換的數據將只是從上次同步到我通過的日期的增量)。

在當前的實現中(因為我想盡可能地通用)如下

      SqlConnection connection = new SqlConnection(connectionString);
                using (SqlCommand command = new SqlCommand("SELECT * FROM XXX", connection))
                {
                    SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(command);

                    DataSet ds = new DataSet();
                    sqlDataAdapter.Fill(ds);

                    using (var memoryStream = new MemoryStream())

                    {
                        ds.WriteXml(memoryStream, XmlWriteMode.WriteSchema);

                        var data = Encoding.UTF8.GetString(memoryStream.ToArray());

//just for test                        File.WriteAllText("c:\\temp\\XXX.txt", data);
                    }
                }

現在對於磁盤上大約 256MB 的表,我得到了 1GB 的 memory 占用空間。 關於如何減少 memory 占用空間的任何建議?

謝謝

減少 memory 的選項:

  1. 不要加載整個表格; 添加一個WHERE子句,可能使用分頁或類似的
  2. 不要使用DataTable - 它不是你提高效率的朋友 如果您只需要數據,請考慮 POCO 類型,可能使用您選擇的任何 ORM
  3. 如果您嘗試寫入文件,請不要使用MemoryStream :直接寫入FileStream ,因此您不需要所有內容的額外副本; 也不需要那個ToArray() - 即使您使用MemoryStream ,也更喜歡GetBuffer()並限制為.Length 或使用StringWriter

我向你解釋.. 因為我需要加載(第一次我需要完全加載大約 30 個表),所以我不需要擁有整個數據集。 我知道 poco 更好,但我必須創建 30 個 POCO,並且必須在客戶端手動 pwrform 插入。 這樣我加載數據集並做一個bulkinsert

如果你看一下文檔,你會看到一個非常簡單的示例數據表的 output。 XML 只是在打開和關閉 xml-tags 的基礎上產生巨大的開銷。

從鏈接

這個:

table.Rows.Add(new object[] { 1, "Mary" }); 
table.Rows.Add(new object[] { 2, "Andy" }); 
table.Rows.Add(new object[] { 3, "Peter" }); 
table.Rows.Add(new object[] { 4, "Russ" });

結果是

 <Table1>  
     <ID>1</ID>. 
     <Name>Mary</Name>    
</Table1>    
<Table1>  
     <ID>2</ID>  
     <Name>Andy</Name>   
</Table1>   
<Table1>  
     <ID>3</ID>  
     <Name>Peter</Name>   
</Table1>   
<Table1>      
    <ID>4</ID>     
    <Name>Russ</Name>  
</Table1>

我想說的是,對於這個小例子,17 個字符和 4 個整數的源內容會產生 156 個字符。 這應該可以解釋為什么對於 256MB 的數據庫,應該預期 1GB 的 memory 占用空間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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