作者niwat (原來如此)
看板Visual_Basic
標題[.NET] 如何加速大檔案讀取存入陣列的速度?
時間Wed Apr 28 11:03:56 2010
請輸入專案類型(網站專案或者應用程式專案):應用程式專案
因為實驗上的需要, 將儀器公司的檔案export成txt file.這個txt file的格式如下:
## Parameter A = xxxx
## ...
.
.
.
以下是數據的部分(用,區隔時間與強度)
time,intensity
每個檔案大約都超過100 MB
參考板上與網路上的的一些文件
使用以下的方法開檔
Dim fileReader As System.IO.StreamReader
fileReader = My.Computer.FileSystem.OpenTextFileReader(TempFileName)
並且將資料放到陣列之中
Do
....
...
ReadTemp = Split(ReadTemp2, ",")
MassSpectraX(SpectraIndexNum - 1, SpectraDataNum) = ReadTemp(0)
MassSpectraY(SpectraIndexNum - 1, SpectraDataNum) = ReadTemp(1)
SpectraDataNum = SpectraDataNum + 1
DataNum = DataNum + 1
Loop
這個部分十分耗時, 導致完成一個檔案讀取與資料放置超過五分鐘..
不知道有沒有什麼方法可以加速這個過程..
以前曾經看過網路文章...似乎透過某種方法改寫
SpectraDataNum = SpectraDataNum + 1這樣累加的程序
可以減少記憶體開啟移除的程序達到加速的目的...但我已經找不到那篇文章了
希望大家可以提供建議...感謝
補充說明:
儀器廠商提供原始檔案是binary file但是儲存的結構(structure)不明..
該儀器公司的軟體可以將原本的binary file轉成文字檔
我希望可以寫一個程式讀取這些文字檔, 並且進行圖譜瀏覽以及後續積分等批次處理
目前功能上大致完成, 但是讀檔加上把圖譜資料放進陣列速度緩慢
補充說明2:
如果先寫一個程式批次將檔案轉成binary格式...
這部分的耗時可以忽略(放著跑)
然後用binary方式讀取,這樣會不會比較有效率?(快速瀏覽圖譜)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 128.123.166.210
推 meto000:改用Input(fileNum,time(Num),intensity(Num))會比較快嗎? 04/28 11:52
推 horngsh:可以用MemoryStream先將讀到的DATA放進去用它當BUFFER較快 04/28 11:58
→ niwat:使用MemoryStream是指..讀檔案時使用memorystream嗎? 04/28 12:42
※ 編輯: niwat 來自: 128.123.166.210 (04/28 13:08)
推 hateking:MemoryStream可以快多少@@? 最近我也在做類似的東西, 04/28 16:14
→ hateking:不過大小頂多才10幾M,所以還好 04/28 16:15
今天已經寫到晃神了...所以還沒有好好的試MemoryStream
我之前有寫過類似的東西,但是因為Data Acquisition的部分也是自己寫的
所以原始資料檔就是Binary的...結構也是自己訂的
30~50 MB的檔案開啟處理都還算快速(跟這次的程式比較)
可能是可以直接Buffer從抓位元數,存進陣列中
且數值本身暫的的大小也比文字模式小,加上不需要用split處理
所以會比較快吧?
也許會朝向把檔案批次再轉成binary格式的檔案...
有結果後再分享....其間各位先進有任何建議請不吝與小弟分享
※ 編輯: niwat 來自: 68.35.0.83 (04/28 16:33)
推 horngsh:迴圈中儘可能不要放方法呼叫或較耗時的東西... 04/29 06:32