線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1822
推到 Plurk!
推到 Facebook!

存成文字檔後卻造成memory不足!!

尚未結案
lsleo
一般會員


發表:19
回覆:28
積分:9
註冊:2003-05-28

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-09-15 21:20:13 IP:210.60.xxx.xxx 未訂閱
各位好~ 現在我正在寫一個抓取網頁的程式,須將每一網頁內容都存成文字檔 我的作法是利用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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-09-16 00:11:46 IP:61.31.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-09-16 00:16:39 IP:61.31.xxx.xxx 未訂閱
對了 多使用搜尋功能能找到不一樣的做法 關鍵字WebBrowser 以下做法也不錯 http://delphi.ktop.com.tw/topic.php?topic_id=28615 我不是高手, 高手是正在銀幕前微笑的人.
------


我不是高手, 高手是正在銀幕前微笑的人.
lsleo
一般會員


發表:19
回覆:28
積分:9
註冊:2003-05-28

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-09-17 10:28:31 IP:210.60.xxx.xxx 未訂閱
哈囉...Miles 我試了您的方法 但是...它還是出現了 out of memory... 還有什麼方法可以用嗎?? 謝謝~
Miles
尊榮會員


發表:27
回覆:662
積分:622
註冊:2002-07-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-09-17 16:45:47 IP:218.160.xxx.xxx 未訂閱
Hi IsLeo : 這..這.. 我就沒輒了, 請先用Debug模式試試, 看是錯在哪一行程式 會出現那個訊息, 還有請問你的作業系統及記憶體多大. 我不是高手, 高手是正在銀幕前微笑的人.
------


我不是高手, 高手是正在銀幕前微笑的人.
lsleo
一般會員


發表:19
回覆:28
積分:9
註冊:2003-05-28

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-09-17 18:08:08 IP:210.60.xxx.xxx 未訂閱
啊~沒輒~~~!!!! 因為那錯誤訊息是在跑了一、兩千筆時才出現的 所以...實在是不大知道中斷點要下在哪裡~ 我的系統是windows 2000,320M記憶體 唉~還煩請各位幫忙囉~
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-09-17 19:14:25 IP:203.222.xxx.xxx 未訂閱
你的問題跟你的記憶體容量無關, 因為 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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-09-18 08:53:31 IP:210.200.xxx.xxx 未訂閱
您好!! 您要的答案在這裡!! 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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-09-18 14:10:19 IP:218.160.xxx.xxx 未訂閱
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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-09-22 16:28:22 IP:210.60.xxx.xxx 未訂閱
HI~Miles 我有使用你所建議的動態建立物件的方式執行程式... 但還是會產生out of memory~ 我有個疑問在程式中要不要放入
Miles
尊榮會員


發表:27
回覆:662
積分:622
註冊:2002-07-12

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-09-23 09:31:37 IP:218.160.xxx.xxx 未訂閱
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 我不是高手, 高手是正在銀幕前微笑的人.
------


我不是高手, 高手是正在銀幕前微笑的人.
系統時間:2024-06-18 5:44:10
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!