[問題] 檔案 IO 加速一問

看板C_and_CPP (C/C++)作者 (阿飄先生)時間15年前 (2011/02/15 19:26), 編輯推噓0(0015)
留言15則, 3人參與, 最新討論串1/2 (看更多)
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) windows: C::B Linux : gcc 問題(Question): 嘗試性的做了一下 "字母+數字" 的全排列方式 先做了一個檔案 ker1.txt 其內容如下: (a~z, 0~9 共 36 個字元各一行) //= ker1.txt ================== a b c . . . z 0 1 2 3 . . . 9 // ============================ 之後跑跑以下的 code // = kerker.c ================= #include <stdio.h> #define N 2 int main () { int i, n; char key[] = "abcdefghijklmnopqrstuvwxyz0123456789"; char in[10], out[10], tmp[50]; sprintf(in , "ker%d.txt", N-1); sprintf(out, "ker%d.txt", N); freopen(in , "r", stdin); freopen(out, "w", stdout); while (gets(tmp) != NULL) { for (i = 0; i < 36; i++) { printf("%s", tmp); putchar(key[i]); putchar('\n'); } } return 0; } //============================= 逐一將 N 的值從 2 調到 4 依序產生 ker2.txt 到 ker4.txt 等檔案 似乎是檔案太大的關係,記事本已經無法打開 ker4.txt 於是我將實驗平台從 windows 上般到 Linux 機器上 成功產生以下檔案 -rw-r--r-- 1 xatier xatier 72 2011-02-15 18:51 ker1.txt -rw-r--r-- 1 xatier xatier 3.8K 2011-02-15 18:52 ker2.txt -rw-r--r-- 1 xatier xatier 183K 2011-02-15 18:52 ker3.txt -rw-r--r-- 1 xatier xatier 8.1M 2011-02-15 18:55 ker4.txt -rw-r--r-- 1 xatier xatier 346M 2011-02-15 18:56 ker5.txt -rw-r--r-- 1 xatier xatier 2.0G 2011-02-15 19:01 ker6.txt ker6.txt 大概跑了六分鐘左右,已經是 2G 大小的東西了 = =a 以 vim 開啟檢查,檔案內容無誤 爾後我測試了將 N 改成 7 的程式 至今已經花了快 半小時 結果還沒跑出來 ======================================== 想請教各位板上先進 像這種大型檔案的 IO 處理 有辦法用其他方法將 printf() putchar() 等函式加速嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 210.60.107.233

02/15 19:28, , 1F
你可以看一下是不是已經跑到硬碟速度的上限了
02/15 19:28, 1F

02/15 19:30, , 2F
Windows下,Notapad++處理大檔案會比記事本還好一點
02/15 19:30, 2F

02/15 19:41, , 3F
是 input 慢還是 output 慢?
02/15 19:41, 3F

02/15 19:41, , 4F
我覺得應該是 output 慢吧? 單從 code 來看,output 多了好
02/15 19:41, 4F

02/15 19:42, , 5F
多次數
02/15 19:42, 5F
xatier@tcirc:~/etc$ ls -l -h -rw-r--r-- 1 xatier xatier 72 2011-02-15 18:51 ker1.txt -rw-r--r-- 1 xatier xatier 3.8K 2011-02-15 18:52 ker2.txt -rw-r--r-- 1 xatier xatier 183K 2011-02-15 18:52 ker3.txt -rw-r--r-- 1 xatier xatier 8.1M 2011-02-15 18:55 ker4.txt -rw-r--r-- 1 xatier xatier 346M 2011-02-15 18:56 ker5.txt -rw-r--r-- 1 xatier xatier 2.0G 2011-02-15 19:01 ker6.txt -rw-r--r-- 1 xatier xatier 2.0G 2011-02-15 19:10 ker7.txt xatier@tcirc:~/etc$ ls -l -rw-r--r-- 1 xatier xatier 72 2011-02-15 18:51 ker1.txt -rw-r--r-- 1 xatier xatier 3888 2011-02-15 18:52 ker2.txt -rw-r--r-- 1 xatier xatier 186624 2011-02-15 18:52 ker3.txt -rw-r--r-- 1 xatier xatier 8398080 2011-02-15 18:55 ker4.txt -rw-r--r-- 1 xatier xatier 362797056 2011-02-15 18:56 ker5.txt -rw-r--r-- 1 xatier xatier 2147483647 2011-02-15 19:01 ker6.txt -rw-r--r-- 1 xatier xatier 2147483647 2011-02-15 19:10 ker7.txt ↑ int 上限 話說 ls 指令似乎無法辨識 2G 以上的檔案大小 ※ 編輯: xatier 來自: 210.60.107.233 (02/15 19:46)

02/15 19:53, , 6F
囧...ker7.txt 終於跑出來但 vim 打不開 = ="
02/15 19:53, 6F

02/15 19:54, , 7F
看了一下,CPU閒得要命,瓶頸顯然在硬碟寫入
02/15 19:54, 7F

02/15 19:57, , 8F
所以這是硬體上的天然限制囉?
02/15 19:57, 8F

02/15 19:58, , 9F
對了,我這裡ker6還沒跑完,已經超過6.5G了
02/15 19:58, 9F

02/15 20:01, , 10F
我這裡用 ls 查只能看到大小是 2G why?
02/15 20:01, 10F

02/15 20:02, , 11F
我不知道,我的系統是CentOS 5.5 64位元版
02/15 20:02, 11F

02/16 10:17, , 12F
ker6.txt 15237476352( 15G) 4m0.642s
02/16 10:17, 12F

02/16 10:17, , 13F
ker7.txt 626913312768(411G) 173m59.702s
02/16 10:17, 13F

02/16 10:17, , 14F
上面是我手邊的伺服器跑出來的 (弄到硬碟爆掉...XD)
02/16 10:17, 14F

02/16 12:46, , 15F
感謝樓上的測試,辛苦了
02/16 12:46, 15F
文章代碼(AID): #1DMcBCMu (C_and_CPP)
文章代碼(AID): #1DMcBCMu (C_and_CPP)