iT邦幫忙

0

請問一下有什麼辦法可以加快速度?

  • 分享至 

  • xImage

是這樣的,
我最近幫人寫一個程式,
大約50萬列 x 計算 100次 x 100倍(所以總共有5000萬列寫進資料庫),
一個檔案大概20G左右,
光是跑一次就10幾個小時,
我想問一下有辦法加快速度嗎?

我的觀念中電腦有三個極限,
一個是CPU、
一個是記憶體、
一個是硬碟的處理速度,
CPU跟記憶體應該是買更好的配備就可以解決,
目前是卡在硬碟的處理速度,
雖然固態硬碟的速度比HDD速度快,
但是還有辦法加快硬碟的處理速度嗎?
因為寫資料庫的速度好像會卡在硬碟的處理速度,
想問一下有沒有辦法加快速度?

weiclin iT邦高手 4 級 ‧ 2018-09-01 23:52:46 檢舉
你要做的應該是先 profiling 之後再來檢討改善方案
一個檔案 20G,那你的記憶體必須抓到 32G 以上,最好能夠 64G 會比較好
不然光是暫存的時間,都會延遲好幾倍的時間
另外,你的 SSD 是有 TEST 過 RW速度嘛,資料庫主要是看 IOPS
以你5000萬筆資料要RW,基本上 5000W * 2 / 10K ( SSD AVG. IOPS ) /3600 = 2.8小時
所以你說換了 SSD 還要跑 十幾個小時,個人是認為你的記憶體大約應該是 16GB
如果希望大大的縮短這個時間,先把記憶體加到 32GB
接著 換 NVME SSD 2G/1G 那種速度的做 RAID 0
NVME SSD RAID 0 可以把 IOPS 從 10K 提升到80K 甚至更高 = 2.8 / 8 = 20 分鐘左右
不過,要看你們有沒有預算
HDD 的 IOPS 做多 500,不建議這種需求用 HDD
不過如果你的DISK BAY 可以讓 HDD RAID 0做到 160個,那是可以考慮用 HDD 來解決
小魚 iT邦大師 1 級 ‧ 2018-09-03 11:59:57 檢舉
真的是16G,
感謝您的建議!
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
暐翰
iT邦大師 1 級 ‧ 2018-09-01 23:06:15

大約50萬列 x 計算 100次 x 100倍(所以總共有5000萬列寫進資料庫),
一個檔案大概20G左右,
光是跑一次就10幾個小時,

包進同一個transation並且bulkinsert
應該不會這麼久才對,就算千萬筆資料
真的不行追求極致效能,甚至可以關掉insert log

另外硬碟應該可以加速超頻,但應該沒人敢超(迷:掛了就慘了)

看更多先前的回應...收起先前的回應...
小魚 iT邦大師 1 級 ‧ 2018-09-02 01:01:39 檢舉

算一算,記憶體的計算時間大概佔8,9成,但是寫單次寫資料庫的時間比單次記憶體計算時間多很多,想問有沒有可能改進這部分。
另外我想問一下,超頻不是超CPU嗎?那不是記憶體的計算速度嗎?應該無法加快硬碟的計算速度吧?

暐翰 iT邦大師 1 級 ‧ 2018-09-02 09:23:12 檢舉

記憶體的計算時間大概佔8,9成,但是寫單次寫資料庫的時間比單次記憶體計算時間多很多

通常可以的,要看程式跟SQL寫法
跟weiclin大大說的一樣
可以用sql server profiler看效能卡在哪

另外我想問一下,超頻不是超CPU嗎?

對,另外通常超頻要考量機器不會過熱 (因為過熱會自動降頻,反而效能差)
還有電量是否足夠。

那不是記憶體的計算速度嗎?

不是,記憶體有自己的時脈速度,跟CPU是分開的

應該無法加快硬碟的計算速度吧?

對,通常不會去超硬碟

小魚 iT邦大師 1 級 ‧ 2018-09-02 13:16:05 檢舉

我想到第二次是一項一項讀,
(一項大概50萬列)
應該可以加個索引,
不過第一次受限於計算速度,
不過還是想問能不能加快硬碟速度,
第二次我就可以用其他方法來處理了

小魚 iT邦大師 1 級 ‧ 2018-09-02 13:18:25 檢舉

看來 CPU 跟記憶體的觀念我還要再加強

硬碟方面,如果是RAID 0的架構,不知道速度可以快多少?

小魚 iT邦大師 1 級 ‧ 2018-09-02 17:03:58 檢舉

pcw
Raid 0 嗎? 倒是不錯的建議,這方面我再瞭解一下。

伺服器通常不會有人這麼勇敢地用 RAID 0 呀
通常是 RAID 5 或是 RAID 50

小魚 iT邦大師 1 級 ‧ 2018-09-03 11:58:58 檢舉

竹本立里
那是個人在用的而已,
伺服器基本上不會是這個架構,
不過如果是 Raid 0 + 1 可行嗎?

小魚 iT邦大師 1 級 ‧ 2018-09-03 12:01:01 檢舉

pcw
我順便問一下,
我有去查一些資料,
不過看起來通常做Raid都是用HDD,
如果用SSD可以做Raid嗎?
會不會效果更好?
(不過好像很貴... @@)

weiclin iT邦高手 4 級 ‧ 2018-09-03 12:39:44 檢舉

用 RAID 1+0, 不要用 0+1

0

程式是用什麼語言? 應該跟你的程式邏輯和資料結構有關係,
或許可以放上來看看有無能優化處理的部份

2
唬爛
iT邦好手 1 級 ‧ 2018-09-02 22:12:08

感覺你的瓶頸不是磁碟I/O!
以一般傳統硬碟寫入速度抓 50MBit/sec => 刻意低估
50MBit x60sec x60min = 175GBit/hr = 21.9GByte/hr
是否完整提供硬體架構?否則無法提供正確建議
SSD寫入速度隨便都幾百MBit/sec => 因此你的瓶頸絕對不是磁碟I/O!

看更多先前的回應...收起先前的回應...
小魚 iT邦大師 1 級 ‧ 2018-09-02 22:27:25 檢舉

第一次計算基本上是 50萬 x 100項 x 100次 計算,
一般的電腦要快大概很難,
第二次卡在讀取資料表的速度,
還有複製資料表的速度,
(資料表太大MySql無法整張表讀取,
只好先複製再分次讀取了,
這邊想說加個索引測試看看,
還沒完成,先不討論)
因為我是全表全欄位讀取,
基本上也不用什麼優化了,
所以才把重點放在硬碟的速度。

唬爛 iT邦好手 1 級 ‧ 2018-09-03 01:10:41 檢舉
  1. 未提供硬體架構,無法推斷架構是否恰當?
  2. 未提供演算法(程式語法,好壞差異很大)
  3. 太多變數了!

硬碟一般就是讀寫速度的差異,而SSD是傳統硬碟的數倍
不過我不認為改用SSD可以改善你的問題!

小魚 iT邦大師 1 級 ‧ 2018-09-03 07:38:28 檢舉

的確不能改善,
因為我已經用SSD了,
客戶那邊也改用SSD,
時間大概從2天減少為1天,
不過還是很多...
雖然想想 50萬 x 100 x 100,
就算1毫秒完成100筆,
也要13個小時才能完成,
所以第一次我不認為能夠再加快,
除非硬體再升級,
比較想處理的是第二次...

唬爛 iT邦好手 1 級 ‧ 2018-09-03 08:31:55 檢舉

所以才說你的瓶頸不在磁碟I/O!
但沒有完整硬體架構,猶如隔空抓藥!
可能瓶頸是硬體!
也可能根本是程式碼(好壞差很大)的問題! => 此部分可能涉及隱私,就先排除
另這種運算,非常占記憶體資源,懷疑是記憶體不足造成!
徵兆之一,MySQL無法一次讀入全部資料表! => 但也可能程式碼撰寫不良造成
不要跟我說,記憶體只有4G or 8G?!
光產出的資料就已經20G!記憶體沒給個32G都嫌太少了!

小魚 iT邦大師 1 級 ‧ 2018-09-03 11:56:50 檢舉

客戶沒那個預算,
不過大概也有16G,
硬體升級可能性不高,
只是客戶嫌速度太慢,
我總是要總結出可能的做法,
說服客戶如果不想多花錢就接受吧 @@

至少已經成功說服 從 HDD -> SSD 了...

唬爛 iT邦好手 1 級 ‧ 2018-09-03 12:08:32 檢舉

那至少記憶體再增加16G吧! => 連16G都花不下去,就真的無言了!
光產出資料20G遠大於實體記憶體16G => 能快才奇怪! => 效能瓶頸,如能拉到64G更好
磁碟I/O目前可以先觀察單一顆SSD是否足以負荷! => 應該足夠了,可以先不計IOPS的數值

小魚 iT邦大師 1 級 ‧ 2018-09-03 12:09:54 檢舉

恩恩, 感謝您的建議.

0
舜~
iT邦高手 1 級 ‧ 2018-09-03 09:22:55

您先確認都關掉其它吃效能的程式~~
ex.更新、挖礦...

假設您的環境超乾淨都沒有任何吃效能的程式~
之前我實驗室的學長用sql跑個統計要放著跑一周(電腦太舊..),當時的解決方式是架設叢集電腦,實驗室有不少空電腦,兩三台組起來跑大概能省下一半時間~~~

看更多先前的回應...收起先前的回應...
小魚 iT邦大師 1 級 ‧ 2018-09-03 11:54:14 檢舉

就是Raid嗎? 感謝~

唬爛 iT邦好手 1 級 ‧ 2018-09-03 12:15:42 檢舉

是叢集運算!不是Disk Raid!差很多

小魚 iT邦大師 1 級 ‧ 2018-09-03 12:23:08 檢舉

你是說資料庫的叢集嗎?
所以叢集可以加快寫入的速度?
還是讀取的速度?
不過我只有一台電腦要連, 應該作用不大吧...

唬爛 iT邦好手 1 級 ‧ 2018-09-03 17:20:48 檢舉

主機也有叢集 => 是『運算』
chaosfractal大的意思是,利用主機分散式叢集運算 => 利用大量的較低效能的電腦,達到或超越一台超高效能的電腦運算等級
想像一下將你的運算分散給100台,運算時間是否可降低至1/100?!

小魚 iT邦大師 1 級 ‧ 2018-09-03 20:40:49 檢舉

喔喔,是這樣喔,
這部分要好好研究一下
/images/emoticon/emoticon33.gif

我要發表回答

立即登入回答