[問題] 大檔案讀寫效能改進方法

看板C_and_CPP (C/C++)作者時間3月前 (2024/07/13 13:40), 3月前編輯推噓15(15021)
留言36則, 13人參與, 2月前最新討論串1/1
餓死抬頭 我大學原本寫C,但進公司後,經由前輩建議,學用Perl 同時也用Perl的強項,Regular expression(正規表示式)來改善工作效能 不過最近碰到一個問題,讓我考慮是不是要回歸C的懷抱 就是我工作上需要對於大型文字檔做讀寫,從3G~10G不等 大致是這樣,從文字檔讀進來,對特定字串做搜尋或修改,然後再寫入 目前以一個字串與3G大小的檔案內容做比較並讀寫約需38s 以兩個字串比較就得花上2分鐘,這效能我不太能接受,同仁也希望能改善 因此想上來問,對於大檔案讀寫有何方法改善效能,是不是真的該回歸C? 目前我查過一些資料,可以使用隨機檔或是binary檔的方法 不過小弟我非這方面強項,所以這方法暫時先沒考慮 或是我可以搜尋什麼關鍵字,找資料我可以自己來 我們公司是使用CentOS 7,記憶體約有1.5T 再麻煩各位了,謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 150.116.208.71 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1720849203.A.211.html

07/13 14:03, 3月前 , 1F
搜尋The One Billion Row Challenge
07/13 14:03, 1F
OK,感謝

07/13 17:06, 3月前 , 2F
我覺得先改格式吧,如果多次對同一個檔案seek,不如拆開
07/13 17:06, 2F

07/13 17:07, 3月前 , 3F
你可以用C寫但是瓶頸可能是io bound
07/13 17:07, 3F

07/13 17:08, 3月前 , 4F
比方先對大檔案做index或分拆,下次少搜少寫趕快
07/13 17:08, 4F

07/13 17:10, 3月前 , 5F
你可以試試看光cp要多久
07/13 17:10, 5F
大概3G大小就要花上約1-2分鐘,用rsync更久.......

07/13 20:35, 3月前 , 6F
你match的regex先給出來看看,是不是卡在regex效能
07/13 20:35, 6F

07/13 20:36, 3月前 , 7F
除非你的程式是邏輯為主,不然你自己寫的regex實作不一定能
07/13 20:36, 7F

07/13 20:37, 3月前 , 8F
贏perl
07/13 20:37, 8F
這我清楚,不過現階段就是要等蠻久的,所以想說擠牙膏看看有沒有辦法擠出更多效能 我的寫法是這樣 $input = "X123.X\\d+.X456.XX.RR\\d+"; $_ = "X123.X11.X456.XX.RR0 = 0.01"; while(<fid_rd>){ $tmp = $_; if($tmp =~ /$input/i){ $tmp =~ s/0\.01/1e15/; } } 由於0.01與1e15都是唯一的,所以我直接寫死在程式內

07/13 22:59, 3月前 , 9F
或者換個說法:「對特定字串做搜尋或修改」是什麼樣的改動?
07/13 22:59, 9F

07/13 23:00, 3月前 , 10F
會想用 regexp 應該是「特定字串」不僅僅是固定文字
07/13 23:00, 10F

07/13 23:00, 3月前 , 11F
那究竟是個什麼樣條件的字串要改成什麼樣子?
07/13 23:00, 11F

07/13 23:01, 3月前 , 12F
然後這個「特定字串」會不會根據需求有變動可能? 怎麼變動?
07/13 23:01, 12F

07/13 23:03, 3月前 , 13F
會說「兩個字串」應該是這樣的修改有兩條或以上的改動規則
07/13 23:03, 13F

07/13 23:03, 3月前 , 14F
這些規則的數量有多少? 規則型態有哪些?
07/13 23:03, 14F

07/13 23:04, 3月前 , 15F
這些都是在考慮要不要換做法時可能會需要評估的問題
07/13 23:04, 15F

07/14 00:08, 3月前 , 16F
原字串和新字串長度一樣嗎?如果長度不一樣,那每次寫入就
07/14 00:08, 16F

07/14 00:08, 3月前 , 17F
勢必要整個檔案重新寫入,寫入的資料量就不是單純修改後的
07/14 00:08, 17F

07/14 00:08, 3月前 , 18F
字串大小而已
07/14 00:08, 18F
只更換其中一個特定關鍵字,上面有

07/14 12:48, 3月前 , 19F
這個高機率是 IO bound,不是 language 的問題
07/14 12:48, 19F

07/14 12:48, 3月前 , 20F
如果有需要更詳盡的解法,建議給一點範例測資
07/14 12:48, 20F
交叉測試過,確定是IO問題沒錯,不過公司硬體設備就是這樣,沒辦法變 所以我只能研究看看是不是能靠coding來補強

07/14 16:48, 3月前 , 21F
先用 profile tool 找熱點吧
07/14 16:48, 21F

07/15 11:15, 3月前 , 22F
前輩好壞 建議學perl
07/15 11:15, 22F
對啊!推坑完就跳槽去更好的公司了XD

07/15 11:35, 3月前 , 23F
兩個字串翻倍代表你檔案讀兩次
07/15 11:35, 23F
對的喔!

07/15 12:57, 3月前 , 24F
關鍵字 mmap , SIMD string lib ?
07/15 12:57, 24F
我來試試,謝謝 ※ 編輯: jacky1989 (150.116.208.71 臺灣), 07/15/2024 23:56:46

07/16 12:34, 3月前 , 25F
mmap或許可以,但要改內容的話可能就..嗯
07/16 12:34, 25F

07/16 14:10, 3月前 , 26F
記憶體夠大,不能把整個檔案塞到RAM處理嗎
07/16 14:10, 26F

07/16 20:26, 3月前 , 27F
你先用dd測一下序列存取同大小的檔案花多久吧?目前的寫法每
07/16 20:26, 27F

07/16 20:26, 3月前 , 28F
行會重新seek,可以看一下檔案系統快取設定有沒有快取到你的
07/16 20:26, 28F

07/16 20:26, 3月前 , 29F
寫入
07/16 20:26, 29F

07/16 20:29, 3月前 , 30F
也能試看看整個檔案丟到ramdisk / fs裡再改的話要多久
07/16 20:29, 30F

08/08 17:03, 2月前 , 31F
你可以先試試看簡單的用mmap取代試試看 看瓶頸在哪
08/08 17:03, 31F

08/08 17:03, 2月前 , 32F
08/08 17:03, 32F

08/08 17:04, 2月前 , 33F
你可以參考一下為何他可能會快一點,以及他如何profile
08/08 17:04, 33F

08/08 17:04, 2月前 , 34F
自己土炮IO效能是一定爛的 讓歷史悠久的工具幫忙吧
08/08 17:04, 34F

08/08 17:05, 2月前 , 35F
Read only的use case應該可以直接套mmap不會有問題
08/08 17:05, 35F

08/08 17:07, 2月前 , 36F
不過1.5T記憶體喔 那直接開個tmpfs在mmap吧XD
08/08 17:07, 36F
文章代碼(AID): #1caXCp8H (C_and_CPP)
文章代碼(AID): #1caXCp8H (C_and_CPP)