是這樣的,
我最近幫人寫一個程式,
大約50萬列 x 計算 100次 x 100倍(所以總共有5000萬列寫進資料庫),
一個檔案大概20G左右,
光是跑一次就10幾個小時,
我想問一下有辦法加快速度嗎?
我的觀念中電腦有三個極限,
一個是CPU、
一個是記憶體、
一個是硬碟的處理速度,
CPU跟記憶體應該是買更好的配備就可以解決,
目前是卡在硬碟的處理速度,
雖然固態硬碟的速度比HDD速度快,
但是還有辦法加快硬碟的處理速度嗎?
因為寫資料庫的速度好像會卡在硬碟的處理速度,
想問一下有沒有辦法加快速度?
大約50萬列 x 計算 100次 x 100倍(所以總共有5000萬列寫進資料庫),
一個檔案大概20G左右,
光是跑一次就10幾個小時,
包進同一個transation並且bulkinsert
應該不會這麼久才對,就算千萬筆資料
真的不行追求極致效能,甚至可以關掉insert log
另外硬碟應該可以加速超頻,但應該沒人敢超(迷:掛了就慘了)
算一算,記憶體的計算時間大概佔8,9成,但是寫單次寫資料庫的時間比單次記憶體計算時間多很多,想問有沒有可能改進這部分。
另外我想問一下,超頻不是超CPU嗎?那不是記憶體的計算速度嗎?應該無法加快硬碟的計算速度吧?
記憶體的計算時間大概佔8,9成,但是寫單次寫資料庫的時間比單次記憶體計算時間多很多
通常可以的,要看程式跟SQL寫法
跟weiclin大大說的一樣
可以用sql server profiler看效能卡在哪
另外我想問一下,超頻不是超CPU嗎?
對,另外通常超頻要考量機器不會過熱 (因為過熱會自動降頻,反而效能差)
還有電量是否足夠。
那不是記憶體的計算速度嗎?
不是,記憶體有自己的時脈速度,跟CPU是分開的
應該無法加快硬碟的計算速度吧?
對,通常不會去超硬碟
我想到第二次是一項一項讀,
(一項大概50萬列)
應該可以加個索引,
不過第一次受限於計算速度,
不過還是想問能不能加快硬碟速度,
第二次我就可以用其他方法來處理了
看來 CPU 跟記憶體的觀念我還要再加強
硬碟方面,如果是RAID 0的架構,不知道速度可以快多少?
pcw
Raid 0 嗎? 倒是不錯的建議,這方面我再瞭解一下。
伺服器通常不會有人這麼勇敢地用 RAID 0 呀
通常是 RAID 5 或是 RAID 50
感覺你的瓶頸不是磁碟I/O!
以一般傳統硬碟寫入速度抓 50MBit/sec => 刻意低估
50MBit x60sec x60min = 175GBit/hr = 21.9GByte/hr
是否完整提供硬體架構?否則無法提供正確建議
SSD寫入速度隨便都幾百MBit/sec => 因此你的瓶頸絕對不是磁碟I/O!
第一次計算基本上是 50萬 x 100項 x 100次 計算,
一般的電腦要快大概很難,
第二次卡在讀取資料表的速度,
還有複製資料表的速度,
(資料表太大MySql無法整張表讀取,
只好先複製再分次讀取了,
這邊想說加個索引測試看看,
還沒完成,先不討論)
因為我是全表全欄位讀取,
基本上也不用什麼優化了,
所以才把重點放在硬碟的速度。
硬碟一般就是讀寫速度的差異,而SSD是傳統硬碟的數倍
不過我不認為改用SSD可以改善你的問題!
的確不能改善,
因為我已經用SSD了,
客戶那邊也改用SSD,
時間大概從2天減少為1天,
不過還是很多...
雖然想想 50萬 x 100 x 100,
就算1毫秒完成100筆,
也要13個小時才能完成,
所以第一次我不認為能夠再加快,
除非硬體再升級,
比較想處理的是第二次...
所以才說你的瓶頸不在磁碟I/O!
但沒有完整硬體架構,猶如隔空抓藥!
可能瓶頸是硬體!
也可能根本是程式碼(好壞差很大)的問題! => 此部分可能涉及隱私,就先排除
另這種運算,非常占記憶體資源,懷疑是記憶體不足造成!
徵兆之一,MySQL無法一次讀入全部資料表! => 但也可能程式碼撰寫不良造成
不要跟我說,記憶體只有4G or 8G?!
光產出的資料就已經20G!記憶體沒給個32G都嫌太少了!
您先確認都關掉其它吃效能的程式~~
ex.更新、挖礦...
假設您的環境超乾淨都沒有任何吃效能的程式~
之前我實驗室的學長用sql跑個統計要放著跑一周(電腦太舊..),當時的解決方式是架設叢集電腦,實驗室有不少空電腦,兩三台組起來跑大概能省下一半時間~~~