2012-09-20 145 views
2

也許我的問題將被關閉,因爲它不夠「建設性」,但無論如何......我已經在尋找答案,但其中大部分都太籠統。對於我的碩士論文項目,我必須抓取很多(即幾千個)網頁,並將它們完全存儲在數據庫中。這是必要的,因爲我必須以不同的方式分析它們,嘗試幾種機器學習算法並以不同的方式解析它們。目前,我正在使用SQlite數據庫來實現此目的,並將Django作爲首選Web框架。查詢HTML數據比查詢SQlite數據庫更有效嗎?

我已將整個單個網頁的HTML數據放入Django TextField,即對於每個網頁,數據庫表中有單獨的行,並且所有網頁的內容都存儲在表的單個列中。現在的問題是查詢和排序數據,尤其是迭代數據非常緩慢。到目前爲止,我已經抓取了大約1000個網頁,數據庫文件的大小已經超過2 GB。此外,我的4 GB內存被完全填滿,我的電腦(Macbook Pro 2009年中,Core2Duo 2.26 Ghz,500 GB HDD,OSX 10.8)無響應。如果我限制要預緩存的項目數,那麼處理數據變得更慢,因爲查詢數量增加。由於我必須抓取更多數據,因此我目前的設置不能很好地擴展。

我現在的問題如下: 如何更有效地存儲我的HTML數據,以便更快地查詢數據?切換到另一個RDBMS如MySQL或PostgreSQL是否有意義?或者你會推薦一個面向文檔的數據庫系統,比如MongoDB?我目前只有SQlite的經驗,所以我不知道該怎麼用。由於我的碩士論文截止日期越來越近,我沒有時間嘗試很多不同的設置。

爲了幫助你在幫我,這裏有一些進一步的要求:

  • 在查詢,而不是吃了我的電腦(工作量的所有內存相比,對於SQLite大的HTML數據多表現不能被分發到其他計算機)和Django
  • 或多或少良好的集成
  • 這是研究工作,只有如此它永遠不會在生產環境中,但只有我的電腦上我的教授之一)
運行(也許還210

如果你幫助我決定我應該採取哪個方向,那將是很棒的事情,因爲我有種失去這種巨大可能性的感覺。非常感謝您提前! :)

+0

你在html頁面查詢哪些數據?你正在進行一些基本的文字搜索嗎? – Jeremy

+0

@Jeremy文本搜索是一個部分,是的,但我也必須分析網頁的HTML結構,並將其用作多種機器學習算法的訓練數據。這就是爲什麼我必須全部存儲網頁,而不僅僅是文本內容。 – pemistahl

+1

許多數據庫(MySQL,SQLAnywhere,MS-SQL Server等)提供內置函數來幫助解析XML數據,這可能有一定的用處(假如HTML格式正確)。這在理論上會降低您的查詢時間,取決於您所追求的內容... – sybkar

回答

2

這只是一個答案,但建議你應該考慮。用代碼片段或提示來處理您的問題需要特別注意。

第一個:儘量減少提取的數據。 這就是說,爲什麼要存儲完整的HTML代碼,我想你只對在網頁上發佈的文本感興趣(即內容)。因此,在抓取HTML數據的過程中將數據剝離並存儲純信息。 如果我錯了,而且你對別的東西感興趣,請隨時糾正我。

第二個:嘗試產生可查詢的數據。您的抓取工具應該以您可以更輕鬆地處理數據的方式將數據寫入數據庫。地圖縮小方法可能是一條路。這將需要更多的時間爬行,但可以實現快速數據檢索。 這幾乎只存儲了一張到你爬過的所有頁面的地圖,而不是完整的內容,至少你的查詢不會觸及完整的數據表,只依賴於地圖縮減的內容。

第三:升級你的硬件 - 你想處理大量的數據嗎?準備好(或帶上時間)。因爲它真的很便宜

第四:SQLite是硬盤驅動器是hdd - 因爲它依賴於操作系統io-cache等等,有時需要年齡才能重新獲取數據。 如果您可以嘗試在SSD驅動器上獲得它(這對長期運行的SSD來說不健康;-))或使用遠程數據庫以快速連接到您的電腦,以便hdd-> ram-> cpu cycle是不是你的限制,但只有RAM,也許CPU(我猜你的程序並不多核心吧?)

五分之四決賽:即使我討厭那些在媒體上,現在到處花言巧語投擲,有看看IBM的文章hadoop

+0

感謝您的詳細解答。 :)關於你的第一點,我還必須分析網頁的HTML結構,而不僅僅是文本內容。這就是爲什麼我必須全部存儲頁面。如果我只需要這些文本,我肯定會去除HTML內容。關於你的第三和第四點:我現在沒有錢購買SSD或升級我的RAM。不,我的程序不是基於多核功能。這是一個網絡應用程序(特別是搜索引擎)。 – pemistahl