我們在進行開發時,會經常使用datatable來儲存和運算元據,我發現在遍歷datatable並對資料進行刪除和新增操作時速度非常慢,查閱相關資料並測試在新增主鍵後可以使遍歷和操作速度提高很多:
測試**,測試的是我們向取出來資料滿足flag!=1條件的所有資料的後面新增一條資料(因為這條資料的一些字段值是根據前面的幾條滿足條件[「accid='」 + accid + 「' and y='」 + year + 「' and absid <= 」 + absid;]資料的值累加得到的)所以需要進行整個datatable的遍歷來計算新增:
public static void test2()
條", table.rows.count);
stopwatch watch2 = new stopwatch();
watch2.start();
datatable newtable = handleaccyear(table,true);
watch2.stop();
console.writeline("資料,遍歷操作時間:毫秒:,秒:", newtable.rows.count, watch2.elapsedmilliseconds, watch2.elapsedmilliseconds / 1000);
} conn.close();
}}填充資料到datatable的方法
public static datatable executedatatable(sqlcommand cmd)
private static datatable handleaccyear(datatable dt, bool iscurre
; if (dt.rows.count > 0)
datarow selectrow = dt.select(filter);
double debitlc = 0, debitqty = 0, creditlc = 0, creditqty = 0, debitfc = 0, creditfc = 0;
foreach (datarow item in selectrow)
}newrow["curdebitlc"] = debitlc;
newrow["curdebitqty"] = debitqty;
newrow["curcreditlc"] = creditlc;
newrow["curcreditqty"] = creditqty;
//newrow["curdebitlc"] = dt.compute("sum(yeardebitlc)", filter);
//newrow["curdebitqty"] = dt.compute("sum(yeardebitqty)", filter);
//newrow["curcreditlc"] = dt.compute("sum(yearcreditlc)", filter);
//newrow["curcreditqty"] = dt.compute("sum(yearcreditqty)", filter);
if (!iscurrency)
程式設計客棧
newdt.rows.add(sourcerow);
newdt.rows.add(newrow);
}else
}} return newdt;
}當不使用主鍵進行遍歷計算插入相應的值時所用時間竟然是這麼多:
當我使用同樣的方法,同樣的資料新增主鍵(即把handleaccyear方法中不使用主鍵下面的注釋去掉後).進行遍歷計算等操作,得出的結果竟然有這麼大的差別:
補充:c# datatable資料量大,迴圈處理資料的時候優化速度
相信大家用for迴圈datatable資料的不會太少,這個在資料量比較小的時候可以接受,但是資料量大的時候卻會造成cpu占用過高,甚至把電腦資源耗盡卡死至無限等待,
其實一些迴圈耗時的操作可以用執行緒池分塊來處理,這樣會減輕cpu很多壓力,好比食堂打飯,當只有乙個視窗的時候勢必等待的時間會非常的長,但是多開幾個視窗的時候卻大大提高效率,
c#中用執行緒池就可以做到,本來一開始的時候我用的是為每個區塊開乙個執行緒,但是有乙個問題就是開了那麼多的執行緒沒辦法結束他們,後來我想到了執行緒池,
具體**如下:
int sid = dt.rows.count % 100 == 0 ? (dt.rows.count / 100) : (dt.rows.count / 100 + 1);
for (int a = 1; a <= sid; a++)
public void todo(object aa)
thread.sleep(2000);
}本文標題: c# datatable資料遍歷優化詳解
本文位址:
C DataTable 快速匯入資料庫
摘自 using system using system.collections.generic using system.linq using system.text using system.data using system.data.sqlclient using system.config...
c datatable根據某個條件過濾資料
判斷datatable中某一行某列的資料為空值的辦法 需要使用datarow類自帶的乙個函式isnull。if datarow.isnull index if convert.isdbnull row.itemarray index 在datareader 如sqldatareader 有相同功能的...
資料庫調優之主機調優
學習資料庫需要對很多東西要理解,包括主機,儲存,資料庫,開發。特別調優。因此,資料庫設計的知識還是比較廣的,這篇文章主要是講解一下主機調優。我遇到過一些關於主機引起的資料庫問題,比如資料庫開啟後,資料庫的效能還可以,但是隨著時間增長,主機的記憶體就會耗得很多,資料庫就會變慢 還有就是io繁忙程度10...