看板 C_and_CPP 關於我們 聯絡資訊
我在做流體力學的時域有限差分的計算 需要把每一個時間點的資料存起來之後再做分析 但是我的計算副程式跟寫檔案花的時間幾乎是一樣長 我原本想說是因為硬碟讀寫速度太慢了 但是後來我弄了ramdisk把資料寫進去也是一樣慢 所以我懷疑是程式碼有問題,想問說該怎麼做改進 以下是我的程式碼 因為我存的資料是2維矩陣所以要2個迴圈然後讀資料寫到硬碟 void writefile(float* data,string filename) { ofstream dataFile(filename.c_str()); for (int i = 0; i < N; i++) { for (int j = 0; j < Nx; j++) { dataFile << data[j +i*Nx] << "\t"; } dataFile << '\n'; } dataFile.close(); } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 1.170.79.135
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