FireBird 2.x 回存問題 |
答題得分者是:RootKit
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
請問各位:
我現在遭遇到一個狀況, 我寫了一支程式, 是要將資料謄寫到一個新的資料庫, 兩者都是 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 發送簡訊給我 |
你用那個元件 去讀 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 發送簡訊給我 |
謝謝 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 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
按RootKit 兄把 A檔Unidiectoial 屬性改為 True (預設False), 只做單向讀取後, 我現在測試到40萬移轉都ok, 比原先多了將近4倍量, 看來這個參數的確降低了不少memory及提高效能, 是否可以抵擋了百萬大軍的數量, 目前我還不確定, 還要再測試, 不過這個方向應該是沒有錯的, 暫時先結案了, 有消息再公佈給各位知道
===================引 用 RootKit 文 章=================== 看一下 UniDirectional 屬性 |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |