有關檔案處理的問題.... |
答題得分者是:dllee
|
ldd
一般會員 發表:12 回覆:62 積分:19 註冊:2004-07-06 發送簡訊給我 |
請問各位高手
我想做一個檔案處理的小程式.....將檔案已Hex的型態表現出來
我利用ListBox 將檔案Load進來...我利用fopen去開檔案將檔案
一個bytes一個bytes做 IntToHex 然後show在ListBox內....
但是ListBox Loading卻很重 cpu通常衝到70-80......利用memo來處理也是
一樣.......處理一個512k的檔案要 9 sec左右 更別說是更大的檔案..
是否有方法讓ListBox loading不要那麼重..... 且顯示的速度快點....
就像UltraEdit一樣 開啟檔案ㄉ速度很快 且轉換成Hex也很快.....THX
|
justdo
高階會員 發表:2 回覆:359 積分:222 註冊:2004-08-17 發送簡訊給我 |
|
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
有看過這篇嗎?
■ 讀取文字檔的速度 LoadFromFile()
http://delphi.ktop.com.tw/topic.php?topic_id=19925
TListBox 在處理 StringList 上的速度是最慢的!! 對於大型檔案,再在顯示上讓使用者認為快,
一定要使用只讀寫部分檔案的能力,這樣才有可能快,
否則,一定要整個檔都讀取,速度就快不起來了。 StatPlus2系統資源監測器 視動科技 VMASK - ViewMove Automation Software Kernel
------
http://www.ViewMove.com |
pwipwi
版主 發表:68 回覆:629 積分:349 註冊:2004-04-08 發送簡訊給我 |
|
ldd
一般會員 發表:12 回覆:62 積分:19 註冊:2004-07-06 發送簡訊給我 |
引言: ldd你好: 在處理和UI有關的TStrings時,開始處理前呼叫ListBox1->Items->BeginUpdate()可以讓UI停止和TStrings的更新。結束後再呼叫EndUpdate就可以回復。 ListBox、Memo、ListView、TreeView(好像是..)都適用pwipwi你好 先謝謝你回覆 的確依你ㄉ方法 的確可以提昇讀取的速度 但是卻不能即使的顯示出檔案.. 要等全部ㄉ檔案都轉換好後 才一起顯示出來...當要顯示很大的檔案時就會 出現問題.使用者會覺得為什麼沒東西出來 還是有點怪怪的. dllee 你好 你提供的文章的確不錯... 之前打速度 檔案處理 一直找不到..真是汗顏... 但是你提供那篇文章是針對文字檔 如果我要開啟一個Binary的話可能不適合 因為用TString 去讀二進位的檔案 只會顯示前面幾行 無法把檔案全部load 進去...勢必還是要靠自己fopen 去開啟檔案 一個Bytes 一個Bytes去轉換成 hex型式... 最後還是會 使用到 add 去加到TString裡面..但文章提到.. 最後的效能還是被add的方法給拉低了......到頭來可能還是跟ListBox的下場好不了多少......不知是否有比較好的方法轉換成hex 然後顯示在 listBox or Memo物件裡面.......:) |
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
我的意思只是 ListBox 的處理速度是最慢的,建議不要使用,
而原文章是用 LoadFromFile 只能用於文字檔沒錯,
但原文章的重點是 TMemo, TListBox 在顯示上處理的速度差,
如果不顯示,速度是可以很快的(TStringList)。
使用讀檔,IntToHex 的方式只要不顯示,速度也可以很快,
您可以測試看看,不要放到 TListBox, 或 TMemo 單單只是
讀檔,作 IntToHex 的轉換,如此,您就可以得到純讀檔
並以 16 進制轉換成字串的時間。[時間1]
之後,您可以再試著使用 TMemo, TListBox 或是其他 VCL 元件
來顯示,再看看時間差多少,所差的時間就是該元件要轉換字串
到畫面所需的時間。[時間2]
如果[時間1]是您可以接受的時間,那就只需花時間找一個合用的
VCL 來顯示即可,如果[時間1]已是您無法接受的時間,那就需要
一個檔分段處理或是找其他 3rd party 的元件。 StatPlus2系統資源監測器 視動科技 VMASK - ViewMove Automation Software Kernel
------
http://www.ViewMove.com |
pwipwi
版主 發表:68 回覆:629 積分:349 註冊:2004-04-08 發送簡訊給我 |
如果讀取時間無法減少的話,可以顯示一個dialog表示在Loading。 另外還有二個作法: .一次配置如夠的buffer讀取整個檔案以減少逐個bytes讀取所花費的時間。
另外可以自已寫個to hex的函數,減少字串在複製時所花的時間。to hex不會用到除法運算,大部份時間是花在字串的記憶體配置和回傳時的複製。 .第二個作法是"lazy evaluation"手法,
因ListBox一次也不會顯示很多,
就只讀取會顯示的byte即可。
如果有需要讀新的byte,再開檔讀就好了。
這個做法或許可以大大的提升速度。
|
ldd
一般會員 發表:12 回覆:62 積分:19 註冊:2004-07-06 發送簡訊給我 |
引言: 如果讀取時間無法減少的話,可以顯示一個dialog表示在Loading。 另外還有二個作法: .一次配置如夠的buffer讀取整個檔案以減少逐個bytes讀取所花費的時間。 另外可以自已寫個to hex的函數,減少字串在複製時所花的時間。to hex不會用到除法運算,大部份時間是花在字串的記憶體配置和回傳時的複製。 .第二個作法是"lazy evaluation"手法, 因ListBox一次也不會顯示很多, 就只讀取會顯示的byte即可。 如果有需要讀新的byte,再開檔讀就好了。 這個做法或許可以大大的提升速度。dllee 你好.. 你所提供的方法 之前就已經測試過了...的確不顯示比顯示時間快了真是不成比例...但是我比較偏向能夠顯示出來 處理速度也比較快......就像UltraEdit一樣.....看起來真要朝其他元件尋找了.. pwipwi你好 也感謝你所提供的方法....目前有想過你提的方法..lazy evaluation的方法...感覺好像不錯.. 但是當使用者想要看最後一筆資料時 必定會重頭拉到尾 不知道是否會造成來不及產生.....之前我的做法 是讓他顯示看到的部分... 隨然還沒讀完檔案 但是使用者還是可以即時看到100行以上的資料.....但是.. 當想要看到最後面的資料時 因為檔案還沒讀完 所以當使用者拉到最後面.... scrollBar還是再往下移動 無法即時顯示完畢.....等顯示完畢又花了太多時間...... 不管怎樣還是需要謝謝兩位大力的相助........如果有更好的方法 在上來分享心得....:) |
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
ldd 您好: 這個問題我之前也希望能解決!
試了很久仍未有重大的改善,在看了您們的討論後,嘗試測試的結果,有了一點心得,跟大家交流一下!
其實寫HexViewer程式的最大問題的確是在:轉換完16進位後放入ListBox,Memo中它的速度,真叫人不能恭維。原先也不清楚是這樣(以為這些元件有經過最佳化),所以一再改寫演算法,但改善的效果微乎其微(現在知道這部分時間差異不大)。直到看了大家的討論,才發現原來時間是耗費在將結果指定給ListBox,Memo的顯示上面。
到目前為止的心得是:
1.利用RichEdit->Lines->LoadFromFile()或RichEdit->Lines->LoadFromStream(),來載入檔案速度提升很多。
2.至於讀入後轉成16進位顯示的部分,可以先動態使用TStringList來儲存計算的結果,接著再一次將其存入File或MemoryStream,最後利用RichEdit將其Load進來,速度明顯提升很多,但與UltraEdit還有幾秒的差距。 在網路上找到一個程式(Delphi),轉成16進位的速度與UltraEdit不分軒輊,很值得研究一下,特提供上來讓大家參考。< href="http://delphi.ktop.com.tw/loadfile.php?TOPICID=17587483&CC=393337">http://delphi.ktop.com.tw/loadfile.php?TOPICID=17587483&CC=393337 RichTop 敬上 =====*****
把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題!
=====#####
|
ldd
一般會員 發表:12 回覆:62 積分:19 註冊:2004-07-06 發送簡訊給我 |
引言: ldd 您好: 這個問題我之前也希望能解決! 試了很久仍未有重大的改善,在看了您們的討論後,嘗試測試的結果,有了一點心得,跟大家交流一下! 其實寫HexViewer程式的最大問題的確是在:轉換完16進位後放入ListBox,Memo中它的速度,真叫人不能恭維。原先也不清楚是這樣(以為這些元件有經過最佳化),所以一再改寫演算法,但改善的效果微乎其微(現在知道這部分時間差異不大)。直到看了大家的討論,才發現原來時間是耗費在將結果指定給ListBox,Memo的顯示上面。 到目前為止的心得是: 1.利用RichEdit->Lines->LoadFromFile()或RichEdit->Lines->LoadFromStream(),來載入檔案速度提升很多。 2.至於讀入後轉成16進位顯示的部分,可以先動態使用TStringList來儲存計算的結果,接著再一次將其存入File或MemoryStream,最後利用RichEdit將其Load進來,速度明顯提升很多,但與UltraEdit還有幾秒的差距。 在網路上找到一個程式(Delphi),轉成16進位的速度與UltraEdit不分軒輊,很值得研究一下,特提供上來讓大家參考。< href="http://delphi.ktop.com.tw/loadfile.php?TOPICID=17587483&CC=393337">http://delphi.ktop.com.tw/loadfile.php?TOPICID=17587483&CC=393337 RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====#####richtop 你好.. 感謝你提供了方法...倒是不錯的想法 先存成檔案 或者記憶體.....檔案小的 話應該是不錯的方向......因為我轉換4mb成hex 只需要 220ms....如果不show出來的話.....也許存成檔案在load出來可能不錯...但是有個缺點... 當你檔案雖然只有4mb但是你存成的檔案可能是他ㄉ兩倍到三倍大..... 因為 1byte轉成hex 需要2byte來顯示...如果自己又加了0x之類ㄉ.....可能會超過四倍到五倍......這看起來也是個問題...存到記憶體是否會導致記憶體不足可能要實驗過才知道..... 還是謝謝你提供的方法.... 在這些之前 你提過用Tsring來存放計算的結果...但是如果用Tstring來存放... 是不是又會牽扯到用 TString 的 Add() ....這樣一來速度勢必又會被拖慢......... |
ldd
一般會員 發表:12 回覆:62 積分:19 註冊:2004-07-06 發送簡訊給我 |
引言:Sorry 那個時間寫錯...剛剛寫了測試所以忘記把設中斷的那邊拿掉..... 4mb要 2-3 secod.....^^?引言: ldd 您好: 這個問題我之前也希望能解決! 試了很久仍未有重大的改善,在看了您們的討論後,嘗試測試的結果,有了一點心得,跟大家交流一下! 其實寫HexViewer程式的最大問題的確是在:轉換完16進位後放入ListBox,Memo中它的速度,真叫人不能恭維。原先也不清楚是這樣(以為這些元件有經過最佳化),所以一再改寫演算法,但改善的效果微乎其微(現在知道這部分時間差異不大)。直到看了大家的討論,才發現原來時間是耗費在將結果指定給ListBox,Memo的顯示上面。 到目前為止的心得是: 1.利用RichEdit->Lines->LoadFromFile()或RichEdit->Lines->LoadFromStream(),來載入檔案速度提升很多。 2.至於讀入後轉成16進位顯示的部分,可以先動態使用TStringList來儲存計算的結果,接著再一次將其存入File或MemoryStream,最後利用RichEdit將其Load進來,速度明顯提升很多,但與UltraEdit還有幾秒的差距。 在網路上找到一個程式(Delphi),轉成16進位的速度與UltraEdit不分軒輊,很值得研究一下,特提供上來讓大家參考。< href="http://delphi.ktop.com.tw/loadfile.php?TOPICID=17587483&CC=393337">http://delphi.ktop.com.tw/loadfile.php?TOPICID=17587483&CC=393337 RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====#####richtop 你好.. 感謝你提供了方法...倒是不錯的想法 先存成檔案 或者記憶體.....檔案小的 話應該是不錯的方向......因為我轉換4mb成hex 只需要 220ms....如果不show出來的話.....也許存成檔案在load出來可能不錯...但是有個缺點... 當你檔案雖然只有4mb但是你存成的檔案可能是他ㄉ兩倍到三倍大..... 因為 1byte轉成hex 需要2byte來顯示...如果自己又加了0x之類ㄉ.....可能會超過四倍到五倍......這看起來也是個問題...存到記憶體是否會導致記憶體不足可能要實驗過才知道..... 還是謝謝你提供的方法.... 在這些之前 你提過用Tsring來存放計算的結果...但是如果用Tstring來存放... 是不是又會牽扯到用 TString 的 Add() ....這樣一來速度勢必又會被拖慢......... |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |