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

TStringList 的 loadfromfile 出現 out of memory, 這指得是什麼memory?

答題得分者是:dllee
Arnor
一般會員


發表:28
回覆:29
積分:16
註冊:2006-10-28

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-09-11 13:39:26 IP:220.135.xxx.xxx 訂閱
TStringList 的 loadfromfile 出現 out of memory, 這指得是什麼memory?
因為看工作管理員程式也沒有吃很多記憶體, 系統的可用記憶體也還很多,
但 loadfromfile 若檔案大一點, 就會有這類錯誤.

這個問題是因memory leak 來導致的?
請問有方法可以有效的預防此類問題嗎?
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-09-11 19:34:26 IP:211.22.xxx.xxx 未訂閱
1.察看TStringList是屬動態產生的VCL物件類別,所以他使用的記憶體指的就是 heap ! 當heap不夠時作業系統也會自動啟用swap技術來取代記憶體,所以只要你的硬體空間夠,應該不是記憶體不足的問題!
2.不知道你的情形是不是跟這篇一樣,造成檔案讀取時發生無法預期的錯誤!參考一下~
===================引 用 Arnor 文 章===================
TStringList 的 loadfromfile 出現 out of memory, 這指得是什麼memory?
因為看工作管理員程式也沒有吃很多記憶體, 系統的可用記憶體也還很多,
但 loadfromfile 若檔案大一點, 就會有這類錯誤.
這個問題是因memory leak 來導致的?
請問有方法可以有效的預防此類問題嗎?
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-09-12 19:36:43 IP:59.105.xxx.xxx 訂閱
我寫了簡單的測試程式,用 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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-09-13 01:55:41 IP:220.135.xxx.xxx 訂閱
如 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-09-13 08:14:19 IP:220.134.xxx.xxx 訂閱
如果是程式開很久,認為可能是 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 重新編輯於 2007-09-13 08:15:46, 註解 Heap‧
dllee 重新編輯於 2007-09-13 08:42:46, 註解 API 取得系統資源‧
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-09-13 13:53:45 IP:220.134.xxx.xxx 訂閱
別結案的那麼快啦,可以分享一下您是否有找出真正的問題所在?
因為這也是其他人(包括我)可以學到經驗的地方。
------
http://www.ViewMove.com
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-09-14 06:29:33 IP:59.105.xxx.xxx 訂閱
之前提的 實體記憶體變少了Memory Status 這兩篇的格式及附件都已更新了,請參考。
如果可以,把您找到的問題分享一下,因為我只是把各種可能都 PO 出來給您參考,
但您的問題會是那一種所造成的並不一定。
------
http://www.ViewMove.com
Arnor
一般會員


發表:28
回覆:29
積分:16
註冊:2006-10-28

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-09-14 11:12:33 IP:220.135.xxx.xxx 訂閱
我主要測試對象是 TIdTCPServer.
面對大量ddos 連線, 程式開啟後, 馬上湧入連線數百個, 不間斷.
程式馬上會用乾它的記憶體空間, 在 Thread 中開啟不了5-10MB 的檔案..
(試過 string 也都無法)

由於世面上找不到很暴力的測試軟體可以模擬這種攻擊,
僅能找到幾個還算堪用的測試的程式, 同時在線數幾百個在操,
但在我本機怎麼測, 也測不出來..真的蠻奇怪的.


實際環境為作業系統為 2003, 雙核CPU, 2GB ram
我個人開發環境為 XP, 單核CPU, 2GB ram
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-09-14 13:41:33 IP:220.134.xxx.xxx 訂閱
如果本機沒問題,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
系統時間:2024-04-20 21:23:56
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!