TStringList 的 loadfromfile 出現 out of memory, 這指得是什麼memory? |
答題得分者是:dllee
|
Arnor
一般會員 發表:28 回覆:29 積分:16 註冊:2006-10-28 發送簡訊給我 |
|
Stallion
版主 發表:52 回覆:1600 積分:1995 註冊:2004-09-15 發送簡訊給我 |
1.察看TStringList是屬動態產生的VCL物件類別,所以他使用的記憶體指的就是 heap ! 當heap不夠時作業系統也會自動啟用swap技術來取代記憶體,所以只要你的硬體空間夠,應該不是記憶體不足的問題!
2.不知道你的情形是不是跟這篇一樣,造成檔案讀取時發生無法預期的錯誤!參考一下~ ===================引 用 Arnor 文 章=================== TStringList 的 loadfromfile 出現 out of memory, 這指得是什麼memory? 因為看工作管理員程式也沒有吃很多記憶體, 系統的可用記憶體也還很多, 但 loadfromfile 若檔案大一點, 就會有這類錯誤. 這個問題是因memory leak 來導致的? 請問有方法可以有效的預防此類問題嗎? |
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
我寫了簡單的測試程式,用 TStringList LoadFromFile 載入一個 226MB 的 zip 檔,並不會有記憶體不足的問題。
之前使用 TListBox 速度問題討論時,載入數十MB的純文字檔也不會有記憶體不足的問題: http://delphi.ktop.com.tw/board.php?cid=31&fid=97&tid=19925 我原本以為是否 TStringList 在 LoadFromFile 時使用了什麼變數會限制大小,但看了一下 VCL 原始碼, LoadFromFile 會叫用 LoadFromStream,在 LoadFromStream 宣告一個 string 變數,把 Stream 整 個讀到這個 string 內,而 Delphi 的 string 可以放得下 2G(或 4G) 的資料,除非您的檔案真的很大,不然, 應該不會有問題。 請將您的測試系統/OS/CPU/MEM/HD, Load 的檔案大小, 內容大略說明一下,才可能知道您到底是遇到 什麼問題。
------
http://www.ViewMove.com |
Arnor
一般會員 發表:28 回覆:29 積分:16 註冊:2006-10-28 發送簡訊給我 |
如 Stallion 之前所解釋, 應該是 heap 的問題, 也就是跟memory leak 應該有關係.
我有向朋友請教, 他說, delphi 的 memory management 要到 2006 之後才有改進, 不然之前版本 memory leak 應該多多少少會有, 我是用D6. (網路上也有很多此類討論). 不過, Stallion 也有提到heap 不夠時系統應該會去調用硬碟, 基本上也不會有問題. 這點就是讓我更迷惑的地方了, 因為這個情況硬是會發生. 我所遇到的案例, 系統都是新系統(XP or 2K3), 實體記憶體都非常足夠使用, 但檔案才幾MB-十幾MB, 在 TStringList 的處理就是會有這個問題.. 當然, 這是在系統和程式都跑了非常久的時候才會有機會發生. 不知有無不似TStringList 這樣使用heap 的物件也可同樣處理我所想要的這種載入一個文字檔案, 可能會對它做某幾行的刪除或修改之類的動作, 有這種替代方案嗎? 朋友說若用GetMem 來配置, 應該就能避免, 可是我都是用TStringList 在處理文字檔案, 所以就不曉得該如何做了. 請指點迷津囉, 謝謝. |
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
如果是程式開很久,認為可能是 Memory Leakage 的問題的話,可能要檢視一下程式是否真的有該 Release 沒 Release 的狀況。
下載 DebugView http://www.microsoft.com/technet/sysinternals/utilities/debugview.mspx 在程式 class/form 等的 .Create 及 .Destroy 加入 API OutputDebugString('xx class Create/Destory') 的除錯訊息看看是否有 Create 沒 Destory 的狀況。 另外,關於 D5/D6 VCL Memory Leakage 我記得有網站提供更新的 VCL code 可以解決原廠 VCL BUG, 不過一時找不到。 還有一種可能,不知道您是否有開工作管理員,查看 User Handle/GDI Objects 等等,其他相關程式 對系統資源的使用狀況,有時可能是其他資源用完,而不是記憶體用完,因為是長時間使用,有個沒 Release 乾淨,就有可能發生各式的問題。 Heap 可以用到近 2G,您的程式吃記憶體那麼兇嗎? 在以前關於記憶體的討論:實體記憶體變少了 我有寫一個測試程式(BCB) Memory Status(目前附件無法下載,已回報) 其中使用到 GetHeapStatus, GlobalMemoryStatus, GetProcessMemoryInfo, GetProcessIoCounters 等 API 取得程式占用系統資源的狀況,如果有需要在自己的程式中查看程式占用資源的狀況, 可定時將以上資訊 Log 或使用 OutputDebugString 再由 DebugView 查看。
------
http://www.ViewMove.com |
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
|
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
之前提的 實體記憶體變少了 及 Memory Status 這兩篇的格式及附件都已更新了,請參考。
如果可以,把您找到的問題分享一下,因為我只是把各種可能都 PO 出來給您參考, 但您的問題會是那一種所造成的並不一定。
------
http://www.ViewMove.com |
Arnor
一般會員 發表:28 回覆:29 積分:16 註冊:2006-10-28 發送簡訊給我 |
我主要測試對象是 TIdTCPServer.
面對大量ddos 連線, 程式開啟後, 馬上湧入連線數百個, 不間斷. 程式馬上會用乾它的記憶體空間, 在 Thread 中開啟不了5-10MB 的檔案.. (試過 string 也都無法) 由於世面上找不到很暴力的測試軟體可以模擬這種攻擊, 僅能找到幾個還算堪用的測試的程式, 同時在線數幾百個在操, 但在我本機怎麼測, 也測不出來..真的蠻奇怪的. 實際環境為作業系統為 2003, 雙核CPU, 2GB ram 我個人開發環境為 XP, 單核CPU, 2GB ram |
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
如果本機沒問題,Server 有問題是否:
1. 是否是 Hub 或 IP 分享器的問題?(試試兩台 Cross 互連) 2. 是雙核心的問題? (試試 在多核(多cpu)下指定process執行於單一核心(cpu)) 3. 「程式馬上會用乾它的記憶體空間」 是真的記憶體用完了嗎?還是多執行緒共享資源的問題? 強力推薦 ShareMe 免費網路硬碟 VMASK VMIO-Server/SECS/GEM dllee's blog dllee's StatPlus
------
http://www.ViewMove.com |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |