2010-05-26 56 views
1

我有一種情況,我不得不每次檢索30,000條記錄到2個數據表。我需要做一些操作並在Manipulate(dt1,dt2)函數中將數據插入到SQL服務器中。我有要做15次,就像你在循環中看到的那樣。現在我想知道在內存使用方面什麼是有效的方法。我使用了第一種方法。請告訴我最好的方法。使用數據表的內存泄漏

(1)

for (int i = 0; i < 15; i++) 
{ 
    DataTable dt1 = GetInfo(i); 
    DataTable dt2 = GetData(i); 
    Manipulate(dt1,dt2); 
} 

(OR)

(2)

DataTable dt1 = new DataTable(); 
DataTable dt2 = new DataTable(); 
for (int i = 0; i < 15; i++) 
{ 
    dt1=null; 
    dt2=null; 
    dt1 = GetInfo(); 
    dt2 = GetData(); 
    Manipulate(dt1, dt2); 
} 
+0

GetInfo和GetData是做什麼的?在'1'中,他們把'i'作爲參數,在'2'中他們沒有。 – Oded 2010-05-26 07:11:47

回答

1

在理論上,第一個例子是更有效的,因爲在第二個例子中在開始通過創建兩個DataTable不會被使用的對象。但是,這兩個對象只包含很少的數據,因此內存使用的開銷很小,幾乎不可能測量。

試圖優化這個例子的性能似乎對我premature optimization,什麼當然是bad thing。您應該首先選擇最具可讀性的解決方案,只有在速度太慢時才進行優化。

然而,對於您的情況,第一個代碼片段肯定比第二個代碼片段更具可讀性,因爲它代碼更少,變量範圍更短,並且不會不必要地將實例重置爲null

0

從你顯示的代碼中,調用new DataTable(),賦值語句再次將dt1和dt2清零,這些都沒有意義。您感興趣的唯一部分是GetInfo(i)GetData(i)返回的內容。當你不需要時,你正在分配空的DataTable對象。

我很好奇你是否有可能重新考慮一下你的設計。當您處理30,000條記錄時,對每條記錄執行多個數據庫操作都不太理想。我經常發現,以數據庫爲中心的操作所帶來的最大性能是由於我可以在一個語句中完成它而發出多個select語句。在設置或批量操作方面進行思考,是否有可能只做一兩個數據庫調用來獲取項目列表,然後迭代它們?如果您正在解決性能問題,那麼這將是一個很好的開始。

在進行更改之前,先測量並驗證哪些操作花費的時間最長,方法是輸入計時代碼並監視應用程序以查看實際使用的內存量。集中精力優化最慢的部分。我希望你覺得這有幫助=)我不是說它在任何方面光顧。