[問題] 讀大量內容檔案,怎麼讀比較快

看板C_and_CPP (C/C++)作者時間11年前 (2014/06/25 14:47), 11年前編輯推噓4(4010)
留言14則, 6人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Microsoft Visual Studio .NET 2010 C++ 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) no 問題(Question): 有無其他寫法,使讀檔案比較快? 餵入的資料(Input): CSV檔案(內容由龐大的數值構成) 檔案內容如下: ---------------------------- 200 1,3,2,....., 2,55,898,977,2..., 3,878,78,21,....., .. 200,55,897,456,..., ---------------------------- 第一行為檔案數目,200代表:每一行會有200個值(中間由逗號隔開),然後總共200行 假設檔案數目為200,代表會設buffer[200][200] 目前作法主要是利用 ifstream fina(name) 讀檔 getline 一次讀一整行 istringstream stream() 並用逗號區分,然後利用迴圈將每一行每個值各自丟入array中 但因為檔案太大,約6000筆,即buffer[6000][6000] 檔案跑完,約花了1分20秒,感覺很久,不知道有無其他讀法能夠更快? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.115.110.234 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1403678860.A.766.html

06/25 14:56, , 1F
弄塊buffer整個讀 程式內再自己切
06/25 14:56, 1F

06/25 15:07, , 2F
因為你讀的是字串還要parsing,可以考慮序列化
06/25 15:07, 2F
參考網路上其他人說法,改用fgets,然後進行每一行的字串分割 由"約1分20秒"改善成"約25秒" 希望有更好的加強辦法^^~謝謝 ※ 編輯: hfuman (140.115.110.234), 06/25/2014 16:14:53

06/25 17:05, , 3F
直接用API的mapped file?
06/25 17:05, 3F
不好意思~~沒學過~我再花時間了解

06/25 18:33, , 4F
用序列化差更多喔,讀文字檔的點座標地圖要一分鐘以上,
06/25 18:33, 4F
不好意思~~沒學過~我再花時間了解

06/25 18:36, , 5F
改成二進制檔案不用一秒 <= 我以前有試過
06/25 18:36, 5F

06/25 18:37, , 6F
一種做法是讀好文字檔後,把array的記憶體資料放進另一個
06/25 18:37, 6F

06/25 18:38, , 7F
檔案,下次讀取直接把此檔案存回array
06/25 18:38, 7F
我現在就是這樣,不然檔案太多,又要分割,原本更慢 ※ 編輯: hfuman (59.102.152.119), 06/25/2014 20:11:19

06/25 22:39, , 8F
我的做法是用 fread , 一次讀 30MB (可調) 進記憶體再切
06/25 22:39, 8F

06/25 22:40, , 9F
用二進位檔真的是最快就是了。
06/25 22:40, 9F

06/29 10:06, , 10F
Release version
06/29 10:06, 10F

06/29 10:07, , 11F
直接快五倍
06/29 10:07, 11F

06/29 12:31, , 12F
parse好存起來 記錄原始檔案hash
06/29 12:31, 12F

06/29 12:32, , 13F
當hash相等的時候就不重新parse
06/29 12:32, 13F

06/29 12:32, , 14F
這種做法其實也是一種compile的過程
06/29 12:32, 14F
文章代碼(AID): #1Jgd2CTc (C_and_CPP)
文章代碼(AID): #1Jgd2CTc (C_and_CPP)