[問題] C++寫檔案速度很慢要怎麼樣加速

看板C_and_CPP作者 (輕子)時間10年前 (2013/08/12 23:29), 編輯推噓14(14015)
留言29則, 16人參與, 最新討論串1/2 (看更多)
我在做流體力學的時域有限差分的計算 需要把每一個時間點的資料存起來之後再做分析 但是我的計算副程式跟寫檔案花的時間幾乎是一樣長 我原本想說是因為硬碟讀寫速度太慢了 但是後來我弄了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

08/12 23:30, , 1F
寫檔本來就很慢
08/12 23:30, 1F

08/12 23:37, , 2F
你動到IO OS就會把這隻程式踢出去等IO做完再拉回來執行
08/12 23:37, 2F

08/12 23:37, , 3F
你寫入太多小片段時間都花在拉進拉出了
08/12 23:37, 3F

08/12 23:39, , 4F
寫到 string buf 裡,再一次寫到檔案,不知道會不會較快.
08/12 23:39, 4F
不好意思我不太懂string buf可以再具體一點說明或者給些參考資料嗎?謝謝! 或者有沒有辦法讓計算跟寫檔案是並行處理? ※ 編輯: Lepton 來自: 1.170.79.135 (08/12 23:42)

08/12 23:59, , 5F
就是你先把資料放到一個buffer裡面(看你要用什麼型態)
08/12 23:59, 5F

08/13 00:00, , 6F
再一次寫入所以資料到檔案 看看能不能加速
08/13 00:00, 6F

08/13 00:00, , 7F
08/13 00:00, 7F

08/13 00:34, , 8F
用sstream去接 然後每一萬筆寫一次看看
08/13 00:34, 8F

08/13 00:41, , 9F
用 mappingfile ?
08/13 00:41, 9F

08/13 08:04, , 10F
sstrream strbuf; strbuf << data[j+ i*Nx] << "\t";
08/13 08:04, 10F

08/13 08:19, , 11F
如果檔案格式沒有限制的話可以試試改成 binary 格式
08/13 08:19, 11F

08/13 08:24, , 12F
以節省浮點數轉字串的運算,並減少資料量
08/13 08:24, 12F

08/13 08:26, , 13F
如果要在不同機器上跑就要注意是否有 endianness 的問題
08/13 08:26, 13F

08/13 12:35, , 14F
你什麼時機寫,每次寫多少資料。
08/13 12:35, 14F

08/13 15:56, , 15F
推stringstream
08/13 15:56, 15F

08/13 18:29, , 16F
根據我的經驗 printf 快很多
08/13 18:29, 16F
感謝網友來信sstrean、binary格式的東西我都不太熟我會研究看看的 我現在寫檔案的時機是GPU算這個時間t的資料,把資料傳回CPU做一些處理後把矩陣寫入 我是先在win7上實驗確定演算都沒問題後丟到linux的工作站上運算 ※ 編輯: Lepton 來自: 1.170.79.135 (08/13 21:15)

08/13 21:56, , 17F
GPU傳回CPU再丟去給IO subsystem 等BUF滿再一次寫出去...
08/13 21:56, 17F

08/13 23:17, , 18F
mmap
08/13 23:17, 18F

08/14 11:34, , 19F
mmap不能跨平台 std::vector<char>跟sstream都能考慮
08/14 11:34, 19F

08/14 14:38, , 20F
thread pool, non blocking. 可參考nodejs
08/14 14:38, 20F

08/14 16:54, , 21F
問題不在寫檔慢, 而是浮點數轉字串很慢;
08/14 16:54, 21F

08/14 16:55, , 22F
如果 data 為整數就快多了; 若不轉格式, 直接存 binary 更快.
08/14 16:55, 22F
感謝各位熱情的回應,讓我學習到sstream、binary寫檔方式 另外 cuteSquirrel 也提供給用sstream的寫檔案方式比起我原本的效率高多了 程式碼連結: http://ideone.com/X3vCc2 ※ 編輯: Lepton 來自: 1.170.79.135 (08/14 17:40)

08/14 19:44, , 23F
請把叫用 fill() 那邊改成填不同值到 data 的處理看看...
08/14 19:44, 23F

08/14 19:46, , 24F
我試的結果, 似乎只轉了第一筆 data, 所以後面的數值都錯了.
08/14 19:46, 24F

08/14 20:21, , 25F
如果要輸出數值正確, 在 ss >> os; 後要加 ss.clear();
08/14 20:21, 25F

08/14 20:22, , 26F
結果似乎還比原來的寫法慢...
08/14 20:22, 26F

08/14 21:25, , 27F
其實ofstream在做IO時都會有Buffer, 可以透過 setbuf 指定
08/14 21:25, 27F

08/14 21:26, , 28F
buffer 大小, 就不會每寫一筆資料就要寫檔案一次。
08/14 21:26, 28F
原來還有這招喔!感謝!又多學了東西 ※ 編輯: Lepton 來自: 1.170.79.135 (08/14 23:55)

08/17 17:43, , 29F
原來可以這樣加速!!
08/17 17:43, 29F
文章代碼(AID): #1I2Fz4Hb (C_and_CPP)
文章代碼(AID): #1I2Fz4Hb (C_and_CPP)