線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1572
推到 Plurk!
推到 Facebook!

請問大型隨機檔最快的Append方法?

答題得分者是:syntax
gerojeng
一般會員


發表:23
回覆:25
積分:9
註冊:2004-06-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-04-21 15:26:45 IP:219.71.xxx.xxx 訂閱
我有一個約 100 MB 的隨機檔案,檔案內一個 record 大小約 30 bytes
如果我只是想在檔案尾端新增幾筆 record , 要怎樣做會比較快呢 ?
我在使用這個檔案為了運算上的效能,一開始會先用 tmemorystream.loadfromfile 把整個檔案載入到記憶體內
這裡也想請問一個觀念上的問題 : 這樣的檔案用 Tfilestream 直接開啟並且進行 Read/ Write 操作,是不是會比用 tmemorystream 差?
是否 tfilestream 呼叫read/write 都會動用到硬碟 ? 還是說其實 tfilestream 自己已經內建一個 tmemorystream ,在開啟檔案的時候
就已經把整個檔案載入到記憶體了?

方法一1 :
呼叫 tmemorystream 的 savetofile 方法 (不知道savetofile的實作方法, 如果是無腦將100mb重寫一次效能應該不高)

方法 2
用 Delphi 內建的函數如 CreateFile / Append/ Write 把新的record 直接寫到檔案最末端

方法 3
用 TFileStream 開啟該100mb檔案然後 Write 新的 record 進去 (聽說 filestream 開檔案 > 2mb 效能會變差是真的嗎?)

請問各位前輩,那種方法會是最快的呢 ? 新手發問請多包涵,觀念上有好多不清楚的地方@@

那,如果是修改/插入/刪除檔案內其中幾筆的紀錄且要儲存的話,那樣做會比較快呢 ? 這個有點頭痛,直接對tmemorystream記憶體操作刪除或者插入
要用copyform把記憶體搬來搬去感覺效率很差,如果要快速插入/刪除,把整個檔案載入到 TList 裡面去做可能比較快,可是到時候要儲存結果又必須
弄個for一筆一筆的將資料寫入到硬碟,這樣效率好像也不是很高? 要把100多mb另外再載入到TList好像也很耗時間和資源,該怎樣做才好@@?


編輯記錄
gerojeng 重新編輯於 2010-04-21 15:38:52, 註解 無‧
gerojeng 重新編輯於 2010-04-21 15:58:58, 註解 無‧
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-04-22 16:29:40 IP:59.125.xxx.xxx 訂閱
僅是新增,超大檔,建議使用 Memory Mapping  File 方式

===================引 用 gerojeng 文 章===================
我有一個約 100 MB的隨機檔案,檔案內一個 record 大小約 30 bytes
如果我只是想在檔案尾端新增幾筆 record , 要怎樣做會比較快呢 ?
我在使用這個檔案為了運算上的效能,一開始會先用 tmemorystream.loadfromfile 把整個檔案載入到記憶體內
這裡也想請問一個觀念上的問題 :這樣的檔案用 Tfilestream 直接開啟並且進行 Read/ Write 操作,是不是會比用 tmemorystream 差?
是否 tfilestream 呼叫read/write 都會動用到硬碟 ? 還是說其實 tfilestream 自己已經內建一個 tmemorystream ,在開啟檔案的時候
就已經把整個檔案載入到記憶體了?

方法一1 :
呼叫 tmemorystream 的 savetofile 方法 (不知道savetofile的實作方法, 如果是無腦將100mb重寫一次效能應該不高)

方法 2
用 Delphi 內建的函數如 CreateFile / Append/ Write 把新的record 直接寫到檔案最末端

方法 3
用 TFileStream 開啟該100mb檔案然後 Write 新的 record 進去 (聽說 filestream 開檔案 >2mb 效能會變差是真的嗎?)

請問各位前輩,那種方法會是最快的呢 ? 新手發問請多包涵,觀念上有好多不清楚的地方@@

那,如果是修改/插入/刪除檔案內其中幾筆的紀錄且要儲存的話,那樣做會比較快呢 ?這個有點頭痛,直接對tmemorystream記憶體操作刪除或者插入
要用copyform把記憶體搬來搬去感覺效率很差,如果要快速插入/刪除,把整個檔案載入到 TList 裡面去做可能比較快,可是到時候要儲存結果又必須
弄個for一筆一筆的將資料寫入到硬碟,這樣效率好像也不是很高? 要把100多mb另外再載入到TList好像也很耗時間和資源,該怎樣做才好@@?


編輯記錄
syntax 重新編輯於 2010-04-22 16:30:34, 註解 漏字 [File]‧
系統時間:2024-04-26 3:49:06
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!