larbin對url庫模組的實現是通過persistentfifo類來完成的,其主要作用是存放新分析出來的url,因為url的量非常大如果將其存放在記憶體中會大量占用記憶體使得整個作業系統變得緩慢,所以選擇了將外存(硬碟)上的文字檔案作為url庫。它採用佇列的思想對url讀取和寫入,這個類包括了對外存文字檔案的建立,讀取和存入操作。
接下來解析一下persistentfifo類
首先需要說明的幾點:
(1)乙個url庫(乙個文字檔案)能儲存的url條數是urlbyfile =10萬,定義在src/type.h中,每條url寫一行,用回車符結束。
(2)url庫存放在安裝根目錄下,也就是跟larbin.conf檔案在同乙個目錄。
(3)url庫的檔名為fifo******,*是數字。比如fifo000001
class persistentfifo ;
事實上,分析到這裡這個類就很清晰了,對照persistenfifo.cc就不難看懂了。但我還需要在這裡說明一下的是readline函式:
char *persistentfifo::readline ()
char *posn = strchr(buf + bufpos, '\n'); //如果buf中存在多條url,它們以回車符分開。
while (posn == null)
if (bufpos*2 > buf_size)
int postmp = bufend;
bool noread = true;
while (noread) else
break;
default:
noread = false;
bufend += rd;
buf[bufend] = 0;
break;}}
posn = strchr(buf + postmp, '\n');
} *posn = 0;
char *res = buf + bufpos;
bufpos = posn + 1 - buf;
return res;
}
怎麼體現我在分析標頭檔案時寫的readline函式的功能:「從buf中讀取一行,如果buf為空,則從檔案中讀取。」呢?
把這個函式捨去一些細枝末節的東西,抽象後:
char *persistentfifo::readline ()
…….}
……}
如果從bufpos位置開始buf中有url,那麼執行語句char *posn = strchr(buf + bufpos, '\n');後posn不為null,那麼下一條url就是[buf+bufpos,posn]之間的字元,如果從bufpos位置開始url中沒有url了,那麼posn會等於null,則進入while(posn == null)的迴圈中,從檔案中讀取url。
AgileFlow的業務persistence設計
經過總結以前的開發教訓和經驗,在實際環境中測試後,準備把agileflow的持久層設計如下 流程定義號1 流程例項號 欄位1 欄位2 欄位3 欄位4 流程例項號 欄位1 欄位2 欄位3 欄位4 流程定義號1 流程定義號2 流程例項號 欄位1 欄位2 欄位3 欄位4 流程例項號 欄位1 欄位2 欄位3...
Larbin學習小結
larbin是乙個用c 開發的開源網路爬蟲,有一定的定製選項和較高的網頁抓取速度。下圖表示了一般爬蟲抓取網頁的基本過程。抓取以 larbin.conf中的starturl做為種子urls開始。下面先來看用於處理url的類 上面的類圖只顯示了url類可見的介面。除了基本的建構函式和私有變數的get函式...
larbin程式重啟方案
問題說明 larbin程式爬取某個 在爬取完所有連線後,如果有定義爬取完後exit 則程式會終止程序 如果沒有定義,larbin程式只會會輸出一些統計資訊,其他貌似都沒工作了,對於新增的連線也不會爬取。鑑於以上問題,larbin程式需要重啟。一下介紹兩個方案,就不貼了。方案一 主要思想 判斷佇列 u...