[問題] 請教C輸出檔案的效能問題

看板C_and_CPP (C/C++)作者 (orange)時間13年前 (2013/04/17 14:07), 編輯推噓3(309)
留言12則, 9人參與, 最新討論串1/1
想請教一下 若有一個1GB的檔案,要依每段資料做輸出 ex: 編號100的資料要輸出至100.txt的檔案內 但檔案內沒有依編號順序呈現 可能有多筆的編號100資料放在不同位置 所想到的是每讀一筆資料,先確認是什麼編號 然後 file = fopen("編號.txt","a"); fwrite 資料進 file 內 fclose(file); 但是發現耗費時間比全部輸出為一個檔案慢非常多 請問有什麼方式可以改善嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.210.112.66

04/17 14:28, , 1F
先把所有資料SORTING完以後依照編號順序寫檔案?
04/17 14:28, 1F

04/17 14:40, , 2F
fopen 後寫完不要馬上關, 等全部處理完再一起關
04/17 14:40, 2F

04/17 14:48, , 3F
一樓那記憶體可能會大爆炸
04/17 14:48, 3F

04/17 14:54, , 4F
折衷就是 讀符合記憶體的數目就先停 sort以後寫
04/17 14:54, 4F

04/17 14:55, , 5F
寫完再讀 loop
04/17 14:55, 5F

04/17 14:59, , 6F
就我看來這就是個外部排序 原 PO 可以找一下這方面的資料
04/17 14:59, 6F

04/17 15:20, , 7F
不要關file應該就夠了
04/17 15:20, 7F
Sort部分因為資料是連接沒有分隔的 只有每段資料一開頭會先給定該個長度,然後是編號及其他內容 但每個資料的長度不是固定,所以有點難排序 請問若不關檔案,除了拿掉fclose(file);外 該如何判斷已經開啟過檔案,並寫入檔案呢? 因為這樣似乎會有重覆開啟檔案的問題QQ" ※ 編輯: orange95 來自: 218.210.112.66 (04/17 16:38)

04/17 16:43, , 8F
最陽春的方法,用一個陣列存 FILE *,最後再一次 close
04/17 16:43, 8F

04/17 16:49, , 9F
看你會不會有檔案太多不能全開的問題 沒有就都開著
04/17 16:49, 9F

04/17 16:50, , 10F
有的話可能是先用N個陣列存放每個檔該寫的東西
04/17 16:50, 10F

04/17 16:51, , 11F
等到某個檔案的暫存陣列滿了就開起來一起寫出去
04/17 16:51, 11F
不好意思,想再請問一下 如果我的編號會有跳號(不是單純的從1開始到最後一個數) 並且一開始並不知道會有哪些編號與編號的數量 是在讀每一段資料時才知道有這個編號 那該如果定義 FILE *變數名稱 呢? 因為原先我是使用 FILE *TEST_ITEM; while (資料內容 != NULL) { ... 抓取編號... TEST_ITEM = fopen("編號.txt","a"); fwrite(rec->data, len, 1, TEST_ITEM); fclose(TEST_ITEM); ... } 變數名稱都使用TEST_ITEM 現在要改成變數,不知道該如何改好>< 而我在輸出每段資料前,為免檔案被重覆fopen 需要先判斷是否已有開啟過對嗎? ※ 編輯: orange95 來自: 218.210.112.66 (04/17 18:23)

04/18 11:05, , 12F
感謝大家的幫助,今天寫出來了,謝謝^^
04/18 11:05, 12F
文章代碼(AID): #1HRZmydI (C_and_CPP)
文章代碼(AID): #1HRZmydI (C_and_CPP)