[討論] 關於讀入檔案做後續處理

看板C_and_CPP作者時間7年前 (2016/10/05 01:28), 7年前編輯推噓4(407)
留言11則, 5人參與, 最新討論串1/1
最近在寫程式時遇到一個疑問,想提出來大家討論看看,看怎樣做比較好 我有一個文字檔,裡面大概有20幾萬行的資料 內容大概是這樣,某一個item,後面有一組數值 a 5 b 6 c 79 ... 那我今天要對這個文字檔做搜尋的動作,而搜尋的關鍵字大概有7-8個 我以結構的方式儲存這些關鍵字與其相關的值 這時候我考量到一個問題,因為文字檔有20幾萬行,那要搜尋7-8次 1.會直接用while-loop方式,從頭搜尋到尾,然後以fseek的方式,將檔案指標指回 檔案起始位置 2.會搜尋完一次先fclose,然後再fopen一次 3.將檔案內容先全部讀進來記憶體,並且以資料串結方式儲存 我這人是用3,因為以我的認知,檔案讀寫雖然有經過緩衝區,但是還是必須對硬碟存取 那搜尋7-8次,就得存取超多超多次 如果我只對檔案存取一次,接著就是對記憶體做讀寫,是否會比較快一點呢?? 這次敘述說真的,不是很清楚,我承認我不太會表達我想表達的 所以如果有需要補充的,請告訴我 感謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.228.250.47 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1475602137.A.B2B.html

10/05 01:31, , 1F
也不需要讀 8 次檔,也用不著全部讀進來儲存
10/05 01:31, 1F

10/05 01:32, , 2F
一次讀一行,用 8 個關鍵字都搜過,再讀下一行就好
10/05 01:32, 2F
這樣子阿~~~我還真的突然沒想到這個方法,感謝指教 ※ 編輯: jacky1989 (61.228.250.47), 10/05/2016 01:33:50

10/05 01:33, , 3F
這樣緩衝區的效果也很好,你寫起程式也很方便
10/05 01:33, 3F

10/05 01:44, , 4F
回到你問的問題,當然整個檔案讀進記憶體再料理比較快
10/05 01:44, 4F

10/05 01:45, , 5F
反正輸入檔也很小,20 萬行大概 20MB 而已,OK 的
10/05 01:45, 5F

10/05 01:46, , 6F
如果輸入檔有 4GB 那就會開始遇到一些額外的麻煩事了
10/05 01:46, 6F

10/05 11:45, , 7F
可以先sort再binary search
10/05 11:45, 7F

10/05 11:53, , 8F
如果關鍵字有唯一性的話我會想建字典
10/05 11:53, 8F

10/05 13:57, , 9F
shell grep 喔耶
10/05 13:57, 9F

10/05 20:08, , 10F
grep 或 寫個 inverse index table
10/05 20:08, 10F

10/05 20:12, , 11F
不過還是推個1樓 現階段最實用
10/05 20:12, 11F
文章代碼(AID): #1Ny-RPih (C_and_CPP)