[問題] C大量開檔關檔可否更快?

看板C_and_CPP (C/C++)作者 (咩嚕咩嚕咩嚕咩~~~~)時間8年前 (2017/08/07 17:47), 編輯推噓2(2027)
留言29則, 7人參與, 最新討論串1/1
開發平台(Platform): (Ex: Win10, Linux, ...) Win10 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) CodeBlock 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) OpenCV 問題(Question): 大家好,如果我想把大量txt檔 1.txt 2.txt 3.txt ______ ______ ______ 1 2 3 1 2 3 1 2 3 打開後將資料讀進再重新輸出成不同的txt檔,但第一個存的是原本每個檔案的第一個值 第二個存的是第二個值... result1.txt result2.txt result3.txt _______ _______ _______ 1 1 1 2 2 2 3 3 3 有何方法能較快速的做完呢? 目前的做法是利用while fopen→fscanf→fprintf→fclose 但是不停開開關關檔案似乎會非常耗時間,要跑很久 但這樣就可以一次只做少量20個檔 慢慢做20 20 20 ... 做完全部大量檔案 有想過直接全部都先讀進array暫存再一次輸出 但會因為資料量龐大,在宣告array時就會錯誤了 可能我的想法比較笨一點QQ 不知道有沒有什麼方法可以解決? 謝謝 餵入的資料(Input): 預期的正確結果(Expected Output): 錯誤結果(Wrong Output): 程式碼(Code):(請善用置底文網頁, 記得排版) 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.230.102.41 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1502099238.A.DF2.html

08/07 17:50, , 1F
array用malloc或new來配置空間
08/07 17:50, 1F

08/07 17:51, , 2F
你用int x[很大的數]一定會出問題
08/07 17:51, 2F

08/07 17:52, , 3F
好 我試試看
08/07 17:52, 3F

08/07 17:59, , 4F
會跳出 std::bad_alloc 的錯誤
08/07 17:59, 4F

08/07 18:01, , 5F
呃那代表你需要的真的太大了orz
08/07 18:01, 5F

08/07 18:05, , 6F
謝謝QQ
08/07 18:05, 6F

08/07 18:11, , 7F
到底是多大,有個數字可以參考嗎?
08/07 18:11, 7F

08/07 18:12, , 8F
20 個檔大可以全部開啟,一起處理,到程式結束時再關閉
08/07 18:12, 8F

08/07 18:13, , 9F
大概450000000
08/07 18:13, 9F

08/07 18:15, , 10F
有試過最後再關閉 可是txt打開卻沒存到 (fprintf "a")
08/07 18:15, 10F

08/07 18:17, , 11F
你先把結果寫到另三個檔寫完後再move回來就不用開開關關的
08/07 18:17, 11F

08/07 18:19, , 12F
沒存到? 你有做 error handling 嗎?
08/07 18:19, 12F

08/07 18:19, , 13F
磁碟存取的意外狀況很多,error handling 不可免
08/07 18:19, 13F

08/07 18:20, , 14F
我不確定沒存到是不是這個問題 因為我讓他們共用一個FILE
08/07 18:20, 14F

08/07 18:21, , 15F
*Ptr 做法是while sprintf(filename,"%d.txt",i)
08/07 18:21, 15F

08/07 18:22, , 16F
然後Ptr=fopen(filename) 才做fprintf(Ptr,)
08/07 18:22, 16F

08/07 18:22, , 17F
..... 共用是哪招,多用一些啊,pointer 很便宜的
08/07 18:22, 17F

08/07 18:24, , 18F
好QQ 我試試看 因為想說已經空間不夠了還開很多Ptr QQ
08/07 18:24, 18F

08/07 18:31, , 19F
即使是 64-bit 一個 pointer 也才 8 bytes
08/07 18:31, 19F

08/07 18:32, , 20F
20 個 pointer 跟你要開的 4.5 億個 int 是小巫見大巫了
08/07 18:32, 20F

08/07 18:33, , 21F
至於輸出檔,如果是一次性的倒是可以寫完就關
08/07 18:33, 21F

08/07 18:48, , 22F
可以成功 速度有快多了 謝謝S大 還有T大跟j大
08/07 18:48, 22F

08/07 18:49, , 23F
不用謝啦我什麼都沒幫上忙哈哈哈
08/07 18:49, 23F

08/07 23:16, , 24F
版上的大大果然厲害(抄筆記
08/07 23:16, 24F

08/07 23:48, , 25F
我可以問一下後來實現的方法嗎?是同時開20個檔案,
08/07 23:48, 25F

08/07 23:48, , 26F
然後直接從裡面找嗎?
08/07 23:48, 26F

08/09 20:52, , 27F
沒存到應該是沒下closefile
08/09 20:52, 27F

08/12 22:36, , 28F
為何不打開第一個檔案一次寫完再開第二個?
08/12 22:36, 28F

08/12 22:36, , 29F
還是我理解錯誤了?
08/12 22:36, 29F
文章代碼(AID): #1PY3Scto (C_and_CPP)
文章代碼(AID): #1PY3Scto (C_and_CPP)