→ EdisonX:寫檔本來就很慢 08/12 23:30
推 wuliou:你動到IO OS就會把這隻程式踢出去等IO做完再拉回來執行 08/12 23:37
→ wuliou:你寫入太多小片段時間都花在拉進拉出了 08/12 23:37
→ EdisonX:寫到 string buf 裡,再一次寫到檔案,不知道會不會較快. 08/12 23:39
不好意思我不太懂string buf可以再具體一點說明或者給些參考資料嗎?謝謝!
或者有沒有辦法讓計算跟寫檔案是並行處理?
※ 編輯: Lepton 來自: 1.170.79.135 (08/12 23:42)
推 wuliou:就是你先把資料放到一個buffer裡面(看你要用什麼型態) 08/12 23:59
→ wuliou:再一次寫入所以資料到檔案 看看能不能加速 08/13 00:00
→ wuliou: 有 08/13 00:00
推 fireslayer:用sstream去接 然後每一萬筆寫一次看看 08/13 00:34
推 damody:用 mappingfile ? 08/13 00:41
推 pichubaby:sstrream strbuf; strbuf << data[j+ i*Nx] << "\t"; 08/13 08:04
→ linotwo:如果檔案格式沒有限制的話可以試試改成 binary 格式 08/13 08:19
→ linotwo:以節省浮點數轉字串的運算,並減少資料量 08/13 08:24
→ linotwo:如果要在不同機器上跑就要注意是否有 endianness 的問題 08/13 08:26
→ MOONRAKER:你什麼時機寫,每次寫多少資料。 08/13 12:35
→ xvid:推stringstream 08/13 15:56
推 johnjohnlin:根據我的經驗 printf 快很多 08/13 18:29
感謝網友來信sstrean、binary格式的東西我都不太熟我會研究看看的
我現在寫檔案的時機是GPU算這個時間t的資料,把資料傳回CPU做一些處理後把矩陣寫入
我是先在win7上實驗確定演算都沒問題後丟到linux的工作站上運算
※ 編輯: Lepton 來自: 1.170.79.135 (08/13 21:15)
→ iFEELing:GPU傳回CPU再丟去給IO subsystem 等BUF滿再一次寫出去... 08/13 21:56
推 lunastorm:mmap 08/13 23:17
推 Killercat:mmap不能跨平台 std::vector<char>跟sstream都能考慮 08/14 11:34
推 Wush978:thread pool, non blocking. 可參考nodejs 08/14 14:38
推 yvb:問題不在寫檔慢, 而是浮點數轉字串很慢; 08/14 16:54
→ yvb:如果 data 為整數就快多了; 若不轉格式, 直接存 binary 更快. 08/14 16:55
感謝各位熱情的回應,讓我學習到sstream、binary寫檔方式
另外 cuteSquirrel 也提供給用sstream的寫檔案方式比起我原本的效率高多了
程式碼連結: http://ideone.com/X3vCc2
※ 編輯: Lepton 來自: 1.170.79.135 (08/14 17:40)
推 yvb:請把叫用 fill() 那邊改成填不同值到 data 的處理看看... 08/14 19:44
→ yvb:我試的結果, 似乎只轉了第一筆 data, 所以後面的數值都錯了. 08/14 19:46
推 yvb:如果要輸出數值正確, 在 ss >> os; 後要加 ss.clear(); 08/14 20:21
→ yvb:結果似乎還比原來的寫法慢... 08/14 20:22
推 Thelink:其實ofstream在做IO時都會有Buffer, 可以透過 setbuf 指定 08/14 21:25
→ Thelink: buffer 大小, 就不會每寫一筆資料就要寫檔案一次。 08/14 21:26
原來還有這招喔!感謝!又多學了東西
※ 編輯: Lepton 來自: 1.170.79.135 (08/14 23:55)
推 xxxx9659:原來可以這樣加速!! 08/17 17:43