2011-04-05 16 views
0

我正在使用API​​(讓我們假裝它的Facebook)來收集兩個給定日期之間的數據。由於API限制(像大多數),我一次只能抓這麼多,因此必須通過結果尋找路線。多個命中API將服務器帶到它的膝蓋

這裏是我的問題/問題,但..它是更好地

  1. 獲得較少結果反饋,並讓更多的對API的調用
  2. 得到更多的返回結果,並減少對API的調用

我運行一個雲服務器的4GB實例..

我在看的數據是XML格式,幷包含約20K條目。每個條目可能包含另外20個標籤。一旦完全拉下來的數據最終大概是10MB ..我的問題是我的問題是,當我的服務器正在打api時,收集這個信息的CPU和內存秒殺近100%。我試過每次檢索500個,一次1000個,每次5000個..這是我需要一次收集20個的東西..或者還有其他我應該看的東西嗎?

我不知道提供什麼其他,如果有什麼我可以提供只是讓我知道

更新基於答案

  • 我與風暴的需求,它運行主機完美的爲我們和似乎是偉大的硬件 - https://www.stormondemand.com/cloud-server/
  • 我使用HPricot解析XML(可能可以優化,我不是專家)
  • 我確實需要所有的數據,此服務不提供導出,僅提供API。

EDIT [幫人磕磕絆絆關於這個版本] 我從角度來說,Hpricot切換到引入nokogiri,要快得多。 此外,我在內存中構建了一個XML文件,顯然這是非常激烈的,而且是一項非常耗時的任務。我已經把這個操作從大約10分鐘縮短到僅僅1分鐘,通過修復這兩件事情。

+0

你需要**所有**的數據嗎?你能改進你的查詢,以便你只得到你想要的東西嗎?服務器運行什麼webserver? – tjameson 2011-04-05 17:38:57

回答

1

這裏的事情列出來看看:

  • 優化代碼。嘗試分析您的代碼並查看是否可以改進它。桅杆可能使用更好的解析器(DOM vs SAX)。
  • 獲得更好的硬件/託管。 4GB只是內存。最有可能你是一個共享的主機/ VM和CPU限制
  • 卸載某些CPU /內存重操作,以更快的服務/應用程序,如XML處理,數據分析,文件IO可以用C/C++
  • 中完成一個適當的雲環境,你應該能夠產生更多的虛擬機,並相應地調整你的工作/負載。這將花費更多的艱難,並需要某種工作經理。
+0

我一直在考慮將我們的一些操作卸載到其他語言一段時間,這可能很容易成爲其中一種。我很難相信它需要100%的CPU來運行10mb的數據值得你知道,謝謝你的建議! – Rabbott 2011-04-05 17:51:15

+1

那麼「其他語言」並不總是最好的答案(只有你知道你當前的語言/協議瓶頸)。通常情況下,一個DOM解析器可能會很餓(猜測你可能正在使用一個)。我強烈建議從列表中的第一個項目符號開始,並學習如何配置/優化當前的代碼。 – Zepplock 2011-04-05 17:53:16

1

您需要問的問題是爲什麼您的CPU +內存尖峯? 4GB是很多處理這些數據,所以你的代碼優化來處理這個任務?如果不是,你可以做什麼?

您的代碼是否足夠優化?很公平。您現在可以使用C擴展名重寫它們。

優化你的代碼後,我建議檢查出處理這個數據'以後',就像在一個延遲的工作。這樣你就不會阻塞整個數據集,這可能會給你的服務器帶來壓力。

您還提到您正在運行雲服務器,我可以假設您可以訪問更多虛擬機。您可以在海旁處理這些數據以減少每臺機器的壓力。

+0

這是真的,我同意使用C擴展(或其他語言)。延遲的工作是計劃,但直到我可以確保DJ不會讓我的服務器癱瘓。對我來說,這個任務應該不會超過1-2分鐘,並且使用最少的CPU,一旦我完成了將它移動到背景。 – Rabbott 2011-04-05 17:57:24