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

作者: jacky1989   2024-07-13 13:40:00
餓死抬頭
我大學原本寫C,但進公司後,經由前輩建議,學用Perl
同時也用Perl的強項,Regular expression(正規表示式)來改善工作效能
不過最近碰到一個問題,讓我考慮是不是要回歸C的懷抱
就是我工作上需要對於大型文字檔做讀寫,從3G~10G不等
大致是這樣,從文字檔讀進來,對特定字串做搜尋或修改,然後再寫入
目前以一個字串與3G大小的檔案內容做比較並讀寫約需38s
以兩個字串比較就得花上2分鐘,這效能我不太能接受,同仁也希望能改善
因此想上來問,對於大檔案讀寫有何方法改善效能,是不是真的該回歸C?
目前我查過一些資料,可以使用隨機檔或是binary檔的方法
不過小弟我非這方面強項,所以這方法暫時先沒考慮
或是我可以搜尋什麼關鍵字,找資料我可以自己來
我們公司是使用CentOS 7,記憶體約有1.5T
再麻煩各位了,謝謝
作者: Dracarys (MayShowGunMore)   2024-07-13 14:03:00
搜尋The One Billion Row Challenge
作者: wulouise (在線上!=在電腦前)   2024-07-13 17:06:00
我覺得先改格式吧,如果多次對同一個檔案seek,不如拆開你可以用C寫但是瓶頸可能是io bound比方先對大檔案做index或分拆,下次少搜少寫趕快你可以試試看光cp要多久
作者: kdjf (我抓得到什麼呢?)   2024-07-13 20:35:00
你match的regex先給出來看看,是不是卡在regex效能除非你的程式是邏輯為主,不然你自己寫的regex實作不一定能贏perl
作者: LPH66 (-6.2598534e+18f)   2024-07-13 22:59:00
或者換個說法:「對特定字串做搜尋或修改」是什麼樣的改動?會想用 regexp 應該是「特定字串」不僅僅是固定文字那究竟是個什麼樣條件的字串要改成什麼樣子?然後這個「特定字串」會不會根據需求有變動可能? 怎麼變動?會說「兩個字串」應該是這樣的修改有兩條或以上的改動規則這些規則的數量有多少? 規則型態有哪些?這些都是在考慮要不要換做法時可能會需要評估的問題
作者: gusion   2024-07-14 00:08:00
原字串和新字串長度一樣嗎?如果長度不一樣,那每次寫入就勢必要整個檔案重新寫入,寫入的資料量就不是單純修改後的字串大小而已
作者: lc85301 (pomelocandy)   2024-07-14 12:48:00
這個高機率是 IO bound,不是 language 的問題如果有需要更詳盡的解法,建議給一點範例測資
作者: b0920075 (Void)   2024-07-14 16:48:00
先用 profile tool 找熱點吧
作者: steak5566 (牛排56)   2024-07-15 11:15:00
前輩好壞 建議學perl
作者: johnjohnlin (嗯?)   2024-07-15 11:35:00
兩個字串翻倍代表你檔案讀兩次
作者: easyman (oops)   2024-07-15 12:57:00
關鍵字 mmap , SIMD string lib ?
作者: alex70266 (小眼)   2024-07-16 12:34:00
mmap或許可以,但要改內容的話可能就..嗯
作者: james732 (好人超)   2024-07-16 14:10:00
記憶體夠大,不能把整個檔案塞到RAM處理嗎
作者: kdjf (我抓得到什麼呢?)   2024-07-16 20:26:00
你先用dd測一下序列存取同大小的檔案花多久吧?目前的寫法每行會重新seek,可以看一下檔案系統快取設定有沒有快取到你的寫入也能試看看整個檔案丟到ramdisk / fs裡再改的話要多久
作者: Killercat (殺人貓™)   2024-08-08 17:03:00
你可以先試試看簡單的用mmap取代試試看 看瓶頸在哪https://nieyong.github.io/wiki_cpu/mmap详解.html你可以參考一下為何他可能會快一點,以及他如何profile自己土炮IO效能是一定爛的 讓歷史悠久的工具幫忙吧Read only的use case應該可以直接套mmap不會有問題不過1.5T記憶體喔 那直接開個tmpfs在mmap吧XD
作者: kingofsdtw (不能閒下來!!)   2024-10-31 20:11:00
開檔分析資料結構?那就是看你定位是讀到記憶體分享還是ramless定位

Links booklink

Contact Us: admin [ a t ] ucptt.com