2013-01-10 75 views
2

我正在研究平臺上通過Twitter API讀取相關的Twitter提要,並將它們存儲在PostgreSQL數據庫中以備將來分析。中間件是Perl,服務器是運行Debian linux的8GB RAM的HP ML310。PostgreSQL阻止太多插入

問題是,Twitter的飼料可能很大(每秒很多條目),我不能等待插入,然後再回來等待下一條推文。所以我所做的就是使用fork(),因此每條推文都會獲得一個新進程,以便插入數據庫和偵聽器,並快速返回以獲取下一條推文。但是,因爲每個這些進程都有效地打開了一個到PostgreSQL後端的新連接,所以系統永遠不會趕上它的twitter feed。

我願意使用連接池建議和/或升級硬件,如果有必要使這項工作,但將不勝感激任何意見。這可能是RAM的限制,還是有配置或軟件方法,我可以嘗試使系統足夠快速?

+2

您可以收集包裝中的數據並使用防滑插入。它更快。 – alex

+0

另外,檢查不必要的索引。它會減慢插入操作。您可以嘗試刪除除主羣集索引之外的所有索引,並稍後處理數據。 – alex

+2

正如@ user1883592所說,批量插入通常更快,如果您不需要立即需要數據,則可以將傳入數據轉儲到一個平面文件中,並執行一個大事務來插入X分鐘值每X分鐘一次。 –

回答

6

如果您打開和關閉的每個插入一個新的連接,這將傷害大時間。您應該使用連接池。創建新的數據庫連接不是一件輕量級的事情。

爲每個插入做一個fork()可能不是一個好主意。難道你不能創建一個只處理插入和偵聽套接字的進程,或者掃描一個目錄或類似的東西,另一個進程表明插入過程(經典的生產者/消費者模式)。或者使用某種消息隊列(我不知道Perl,所以我不能說那裏有什麼樣的工具)。

當執行批量插入操作時,在一個事務中執行它們,最後發送提交。不要提交每個插入。另一種選擇是將行寫入文本文件,然後使用COPY將它們插入數據庫(它不會比這更快)。

您還可以調整PostgreSQL服務器。如果您在系統崩潰的情況下可以承受失去一些交易,您可能需要關閉synchronous_commit

如果您可以隨時重新創建表(例如,通過重新插入推文),您可能還想將該表設置爲「未記錄」表。它的寫作速度比普通錶快,但如果Postgres沒有完整顯示,則會丟失表中的所有數據。

0

使用COPY命令。 一個腳本讀取Tweeter並將字符串附加到磁盤上的CSV文件。 查找磁盤上的CSV文件的其他腳本,重命名此文件並從此文件啓動COPY命令。