c# 大量資料 字串處理 及sql 寫入
測試時發現個問題
假設 20萬筆資料 每筆是 10個字串
將他用迴圈 串成一個字串
執行久是意料之中
但是發現 太久了
程式感覺沒死 也沒有錯誤產生 但 結果就出不來
debug 迴圈 到一定長度 忘了看(有需要在試) 反正很長
C# 好像會處理不過來 就耗在那邊
------------------------------------------------
後來切開 50 個陣列 分開存
到後面再合併 就快很多 至少會動了
結論是 C# 合併字串太長 要分開處理
至少不要串超過 4萬 依照一般 應該是 65536這個限制
-----------------------------------------------
然後要20萬筆要寫入SQL
有個問題
insert into DB (F1,F2,F3) values (data1,data2,data3)
這樣一次塞20萬筆 送 SQL 一定死
但一筆一筆寫 又太慢 等到天荒地老
所以用
insert into DB (F1,F2,F3) values
(data1,data2,data3),
(data1,data2,data3),
(data1,data2,data3),
(data1,data2,data3)
.
.
這樣塞 至少省掉 前面的字 (SQL2008以後才有)
但極限測試.....錯誤出來了
INSERT 陳述式中資料列值數目運算式超過允許的 1000 資料列值數目的上限。
所以只好用迴圈算 1000 筆 長度是 68081 是沒問題
最好用 for() 不要用 foreach() 應要算筆數 而且 最後不能有 ,
雖然還不到飛的速度
但至少 比 20萬次 變成 送200次好多了
後面就是 電腦硬碟+運算速度 問題
還有種方式
壓縮SQL Server Log.ldf資料(解決ldf檔案過大問題)
若要壓縮特定資料庫的所有資料和記錄檔,請執行 DBCC SHRINKDATABASE 命令。若要一次壓縮特定資料庫的一個資料或記錄檔,請執行 DBCC SHRINKFILE 命令。
DBCC SHRINKFILE (DBFNAME_log, 2);
壓縮SQL的LOG指令:
DBCC SHRINKFILE(DbName_Log,1)
這是檔案的大小 (MB),以整數表示。 若未指定,DBCC SHRINKFILE 會將大小縮減成預設檔案大小。 預設的大小是在建立檔案時所指定的大小。
DBCC SHRINKFILE (DbName_Log);
在smarterasp 的虛擬主機 下 無法 指定檔名壓縮 可能是檔案權限不夠或是 名字是虛擬的
但可用管理頁面 做壓縮
假設 20萬筆資料 每筆是 10個字串
將他用迴圈 串成一個字串
執行久是意料之中
但是發現 太久了
程式感覺沒死 也沒有錯誤產生 但 結果就出不來
debug 迴圈 到一定長度 忘了看(有需要在試) 反正很長
C# 好像會處理不過來 就耗在那邊
------------------------------------------------
後來切開 50 個陣列 分開存
到後面再合併 就快很多 至少會動了
結論是 C# 合併字串太長 要分開處理
至少不要串超過 4萬 依照一般 應該是 65536這個限制
-----------------------------------------------
然後要20萬筆要寫入SQL
有個問題
insert into DB (F1,F2,F3) values (data1,data2,data3)
這樣一次塞20萬筆 送 SQL 一定死
但一筆一筆寫 又太慢 等到天荒地老
所以用
insert into DB (F1,F2,F3) values
(data1,data2,data3),
(data1,data2,data3),
(data1,data2,data3),
(data1,data2,data3)
.
.
這樣塞 至少省掉 前面的字 (SQL2008以後才有)
但極限測試.....錯誤出來了
INSERT 陳述式中資料列值數目運算式超過允許的 1000 資料列值數目的上限。
所以只好用迴圈算 1000 筆 長度是 68081 是沒問題
最好用 for() 不要用 foreach() 應要算筆數 而且 最後不能有 ,
雖然還不到飛的速度
但至少 比 20萬次 變成 送200次好多了
後面就是 電腦硬碟+運算速度 問題
還有種方式
使用 BULK INSERT 或 OPENROWSET(BULK...) 匯入大量資料 (SQL Server)
沒試 應該事先寫成一個 txt檔 再 匯到 SQL
有需要再試
注意事項先標記 黑暗執行序 上頭說的
壓縮SQL Server Log.ldf資料(解決ldf檔案過大問題)
若要壓縮特定資料庫的所有資料和記錄檔,請執行 DBCC SHRINKDATABASE 命令。若要一次壓縮特定資料庫的一個資料或記錄檔,請執行 DBCC SHRINKFILE 命令。
DBCC SHRINKFILE (DBFNAME_log, 2);
壓縮SQL的LOG指令:
DBCC SHRINKFILE(DbName_Log,1)
UserDB
使用者資料庫中名為 DataFile1
之資料檔案大小壓縮成 7 MBDBCC SHRINKFILE (DataFile1, 7);
DBCC SHRINKFILE (DbName_Log);
在smarterasp 的虛擬主機 下 無法 指定檔名壓縮 可能是檔案權限不夠或是 名字是虛擬的
但可用管理頁面 做壓縮
留言
張貼留言