全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1563
推到 Plurk!
推到 Facebook!

FireBird 2.x 回存問題

答題得分者是:RootKit
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-10-29 16:57:07 IP:118.160.xxx.xxx 未訂閱
請問各位: 
我現在遭遇到一個狀況, 我寫了一支程式, 是要將資料謄寫到一個新的資料庫, 兩者都是 FireBird 的 gdb 檔, 我使用的FireBird 測試過由 1.5x 至 2.x 版都出現一樣的狀況

我是利用 IBX 元件作業, 例如 原檔 A 內含20萬筆要轉到 新檔 B
當然其中還是有做一些判斷流程, 現在的問題是
在 XP 模式下(4G RAM) , 大概回存到 12萬-14萬筆就出現 OUT OF MEMORY 的錯誤
在 2003 SERVER 下約 15-19萬筆(2G RAM) 也會出現

原一度懷疑記憶體在大量使用下造成SWAP出問題, 所以我試著每1萬筆(5000筆也試過)
就下一次 B.COMMINT 回存, 同時關閉B, 再重新開啟, 結果還是一樣
流程大致如下(以下並非真實程式碼, 因為太多了)
WHILE NOT A.EOF DO BEGIN
IF A ... 判斷式 THEN ....
B.APPEND;
B.欄位= A.欄位
IF B.RECCOUNT MOD 5000=0 THEN BEGIN
B.APPLYUPDATE;
B.COMMIT;
END;
A.NEXT;
END;

但我確信的是 OUT OF MEMORY 並非真的記憶體出現不足現象, 也曾調整XP的SWAP系統管理, 無效
不知有沒有那位有類似經驗解決的?
kadee
高階會員


發表:11
回覆:141
積分:165
註冊:2002-03-20

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-10-29 20:55:08 IP:59.127.xxx.xxx 訂閱
你用那個元件 去讀 A?

1.試試看用 tibquery 一次抓A的5000筆,寫到 B 後,commit,
再抓A的 5000筆。
2.試試看不要用 catchupdate的方式。
3.firebird 的 forcewrite =true



******
必利得免費進銷存 總帳系統
(不限時間筆數,含網路版),
歡迎下載使用
www.bigredinf.net 必利得資訊
******
===================引 用 P.D. 文 章===================
請問各位:
我現在遭遇到一個狀況, 我寫了一支程式, 是要將資料謄寫到一個新的資料庫, 兩者都是 FireBird 的 gdb 檔, 我使用的FireBird 測試過由 1.5x 至 2.x 版都出現一樣的狀況

我是利用 IBX 元件作業, 例如 原檔 A 內含20萬筆要轉到 新檔 B
當然其中還是有做一些判斷流程, 現在的問題是
在 XP 模式下(4G RAM) , 大概回存到 12萬-14萬筆就出現 OUT OF MEMORY 的錯誤
在 2003 SERVER 下約 15-19萬筆(2G RAM) 也會出現

原一度懷疑記憶體在大量使用下造成SWAP出問題, 所以我試著每1萬筆(5000筆也試過)
就下一次 B.COMMINT 回存, 同時關閉B, 再重新開啟, 結果還是一樣
流程大致如下(以下並非真實程式碼, 因為太多了)
WHILE NOT A.EOF DO BEGIN
IF A ... 判斷式 THEN ....
B.APPEND;
B.欄位= A.欄位
IF B.RECCOUNT MOD 5000=0 THEN BEGIN
B.APPLYUPDATE;
B.COMMIT;
END;
A.NEXT;
END;

但我確信的是 OUT OF MEMORY 並非真的記憶體出現不足現象, 也曾調整XP的SWAP系統管理, 無效
不知有沒有那位有類似經驗解決的?
------
Kadee/BigRed Ent.
www.tw165.com
編輯記錄
kadee 重新編輯於 2009-10-29 20:57:49, 註解 無‧
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-10-29 21:53:16 IP:118.160.xxx.xxx 未訂閱
謝謝 kadee 兄指點, 以下回覆
1. A 是用 TIBQUERY 讀取, 由於是讀取而己, 所以 catchupdate 並沒有開
2.因為 A 的記錄並不是一次完整過到 B, 說白了, A檔就是在做年度結算, 可能 A 有上百萬筆, 要把其中符合的條件過到 B檔中
這其中又連結很多的運算分析才過 B, 所以並不容易一次有辦法抓取5000筆的量來讀, 所以我是利用特別的做法把要過的抓出來, 並不一定是5000筆
3.FIREBIRD 的 FORCEWRITE 是在那個地方找得到, 我看 TIBQUERY 只有 FORCEREFRESH
4.另外, 我也嘗試過 B檔用 TIBSQL 元件來做, 因為沒有回傳動作, 可能可以過, 但結果還是在大約量的筆數上下 COMMIT 時就出現 OUT OF MEMORY, 所以B 試過 TIBQUERY(CACHEUPDATE=TRUE), TIBSQL 方式
===================引 用 kadee 文 章===================
你用那個元件 去讀 A?

1.試試看用? tibquery? 一次抓A的5000筆,寫到 B 後,commit,
再抓A的 5000筆。
2.試試看不要用 catchupdate的方式。
3.firebird 的 forcewrite =true
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-10-30 00:11:27 IP:122.126.xxx.xxx 訂閱
看一下 UniDirectional 屬性
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-10-30 12:47:22 IP:118.160.xxx.xxx 未訂閱
按RootKit 兄把 A檔Unidiectoial 屬性改為 True (預設False), 只做單向讀取後, 我現在測試到40萬移轉都ok, 比原先多了將近4倍量, 看來這個參數的確降低了不少memory及提高效能, 是否可以抵擋了百萬大軍的數量, 目前我還不確定, 還要再測試, 不過這個方向應該是沒有錯的, 暫時先結案了, 有消息再公佈給各位知道
===================引 用 RootKit 文 章===================
看一下 UniDirectional 屬性
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-10-30 14:05:25 IP:118.160.xxx.xxx 未訂閱
剛才測試了78萬筆也都可以過關, 看來百萬大軍是沒有問題了, 這樣應該是可以解決系統的問題了, 而且78萬筆現在做下來只花了1小時左右(之前12萬就要花掉2小時)
系統時間:2024-04-23 19:32:36
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!