[英]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 的選項:
WHERE
子句,可能使用分頁或類似的DataTable
- 它不是你提高效率的朋友; 如果您只需要數據,請考慮 POCO 類型,可能使用您選擇的任何 ORMMemoryStream
:直接寫入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.