存成文字檔後卻造成memory不足!! |
尚未結案
|
lsleo
一般會員 發表:19 回覆:28 積分:9 註冊:2003-05-28 發送簡訊給我 |
各位好~
現在我正在寫一個抓取網頁的程式,須將每一網頁內容都存成文字檔
我的作法是利用WebBrowser元件將網頁下載下來
然後再將資料內容放置Memo元件中,再存成文字檔
但現在面臨到一個問題...因為我要抓取的網頁非常多,超過四十萬頁
隨著抓取的網頁數量越來越多,memory越來越少
最後就出現了memory不足的訊息~
請問有什麼方式可以解決這個問題呢???
PS:memo元件存成文字檔的寫法:
var Outfile:TextFile; AssignFile(OutFile,'download\' inttostr(PatNO) '.txt');
Rewrite(outFile);
writeln(outfile,memo1.Text);
closefile(Outfile);
|
Miles
尊榮會員 發表:27 回覆:662 積分:622 註冊:2002-07-12 發送簡訊給我 |
Hi IsLeo 您好:
何不直接寫到檔案不透過TMemo
procedure TForm1.Button2Click(Sender: TObject); begin WebBrowser1.Navigate('www.kimo.com.tw'); end; procedure TForm1.Button1Click(Sender: TObject); var vv: Variant; HTMLDocument: IHTMLDocument2; tmpStr,tmpfilepath:string; src:string; F : TextFile; begin HTMLDocument := webbrowser1.Document as IHTMLDocument2; AssignFile(F, 'c:\a.html'); ReWrite(F); writeln(F,HTMLDocument.body); //memo1.lines.text:=HTMLDocument.body; CloseFile(F); HTMLDocument.close; end;我不是高手, 高手是正在銀幕前微笑的人.
------
我不是高手, 高手是正在銀幕前微笑的人. |
Miles
尊榮會員 發表:27 回覆:662 積分:622 註冊:2002-07-12 發送簡訊給我 |
對了 多使用搜尋功能能找到不一樣的做法
關鍵字WebBrowser 以下做法也不錯
http://delphi.ktop.com.tw/topic.php?topic_id=28615 我不是高手, 高手是正在銀幕前微笑的人.
------
我不是高手, 高手是正在銀幕前微笑的人. |
lsleo
一般會員 發表:19 回覆:28 積分:9 註冊:2003-05-28 發送簡訊給我 |
|
Miles
尊榮會員 發表:27 回覆:662 積分:622 註冊:2002-07-12 發送簡訊給我 |
|
lsleo
一般會員 發表:19 回覆:28 積分:9 註冊:2003-05-28 發送簡訊給我 |
|
syntax
尊榮會員 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
你的問題跟你的記憶體容量無關, 因為 windows 的記憶體容量好像至少是 4GB,即使你只有很少的實體記憶體, 牌除你的程式碼本身有錯以外
跟你的
1. 硬碟剩餘空間有關, 可能是硬碟空間用完, 所以無法 swap memory --> 想辦法增加硬碟空間
2. TMemo 元件乃是封裝 TStringList 的應用, 在 TStringList 上有者字串長度最大的限制, 總容量沒計錯, 應該是 2GB 左右的大小, 也就是說你的資料最多只能放 2GB 到 TMemo 中, 所以才會出現記憶體不足 --> 解決方式:
-->a.每抓一頁, 就存一頁, 如同 Teleport pro 的做法, 這樣就不會記憶體不足
-->b.因為不知道你的網頁每頁的總容量(文字 圖 音效), 所以直接判斷 TMemo 中 TStringList 的 Capacity, 若是要增加的資料加上 Capacity 後會太大, 則應該先作輸出存檔 不過要用完 2GB 的空間實在是不容易, 除非是你的網頁每頁都有 200kb 的文字 圖形, 那 2000 頁 = 2000 x 200 = 400000 kb = 390 MB, 那也要 5 備才會撐暴啊, 所以必較有可能的是你的硬碟置換空間用完所致
|
G01
高階會員 發表:249 回覆:379 積分:215 註冊:2002-05-21 發送簡訊給我 |
您好!! 您要的答案在這裡!! Enjoy It !!
implementation {$R *.dfm} uses MSHTML; procedure TForm1.StartClick(Sender: TObject);
var vv: Variant;
HTMLDocument: IHTMLDocument2;
tmpStr,tmpfilepath:string;
src:string;
F : TextFile;
begin
WebBrowser1.Navigate('www.yahoo.com.tw');
repeat
Application.ProcessMessages;
HTMLDocument := webbrowser1.Document as IHTMLDocument2;
until(HTMLDocument <> nil)and(webbrowser1.Busy = FALSE);
//-------------------------------------------------------
AssignFile(F, 'c:\a.txt');
if(FileExists('c:\a.txt') = FALSE)then
begin
ReWrite(F);
CloseFile(F);
AssignFile(F, 'c:\a.txt');
end;//if...end!!
Append(F);
writeln(F,HTMLDocument.body);
CloseFile(F);
HTMLDocument.close;
ShowMessage('完成!!');
end;
|
Miles
尊榮會員 發表:27 回覆:662 積分:622 註冊:2002-07-12 發送簡訊給我 |
Hi Isleo您好:
我剛剛用工作管理員看了一下, 果然記憶體會越來越大,我猜想應該是WebBrower會保留一些資料在記憶體, 例如在上一頁下一頁時的動作, 所以我剛剛又重寫了一次程式也就是將WebBrowser用動態建立, 寫檔完後就Free掉, 從工作管理員看記憶體是不會加大, 程式大致如下, 請再改寫測試看看.也許Delphi有函數可以直接清掉那些暫存的記憶體但我還沒找到, 我再去搜尋看看
procedure TForm1.Button2Click(Sender: TObject); begin if Assigned(webbrowser1) then begin WebBrowser1.Free; webbrowser1 := nil; end; webbrowser1 := TWebBrowser.Create(Form1); webbrowser1.ParentWindow := Form1.Handle; webbrowser1.Show; webbrowser1.Top := 50; webbrowser1.Left := 10; webbrowser1.Width := 200; webbrowser1.Height := 300; WebBrowser1.Navigate(Edit1.Text); end;發表人 - miles 於 2003/09/18 14:13:04
------
我不是高手, 高手是正在銀幕前微笑的人. |
lsleo
一般會員 發表:19 回覆:28 積分:9 註冊:2003-05-28 發送簡訊給我 |
|
Miles
尊榮會員 發表:27 回覆:662 積分:622 註冊:2002-07-12 發送簡訊給我 |
IsLeo您好:
我剛剛在網路上看了一下http://www.mers.com/searchsite.html#newssearch
使用WebBrowser Memory去找後來發現TWebBrowser竟然會有Memory Leak 相關文章
http://www.mers.com/cgi-bin/mer.exe/EXECSEARCH?searchtext=WebBrowser+Memory&grouptext=Delphi&pageno=2&msgno=4780&boardno=590&linktype=vwthread
我想可能要再請其他先進高手指點了, 另外也許可用以下的方法試試
http://delphi.ktop.com.tw/topic.php?topic_id=28615 我不是高手, 高手是正在銀幕前微笑的人.
------
我不是高手, 高手是正在銀幕前微笑的人. |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |