2011-05-17 157 views
2

我有一個每三分鐘運行一次的cron作業,它會從遠程API抽取一些數據,然後將其存儲在本地數據存儲中。但是,這會在數據存儲放置操作中佔用大量的CPU時間。我懷疑我可能做一些非常愚蠢的,可優化很多:如何最大限度地減少數據存儲使用的CPU時間

result = urllib2.urlopen(url).read() 
foos = json.loads(result)['foo'] 
bars = json.loads(result)['bar'] 

models = [] 
for foo in foos: 
    d = FooContainer() 
    d.Property = foo.Value #in real code, this is setting a load of values based off foo  
    models.append(d) 

for bar in bars: 
    d = BarContainer() 
    d.Property = bar.Value #in real code, this is setting a load of properties based off bar 
    models.append(d) 

db.put(models) 

正如你所看到的,我存儲每一塊回來在我的本地數據表的新「行」的數據。是否有一些技術可以用來減少此cron作業使用的大量數據存儲CPU時間?

+0

您要保存多少個實體? – systempuntoout 2011-05-17 12:13:23

+0

最新工作保存了217個小時和137個小節。大多數工作將大致相同 – Martin 2011-05-17 12:24:53

回答

6

〜2k cpu_ms看起來正確。您看到46k api cpu_ms,因爲數據存儲區只能寫入最大值。每秒10個實體(由api控制),並且您正在編寫450多個實體,因此450+/10約爲46k cpu_ms。

api的使用情況不會直接計入您的配額底線,只有real〜2k會計。所以不要擔心,你就好。

+0

因此,儘管appengine控制檯警告我每次這個cron作業運行時平均使用59070,那麼這真的沒有關係? – Martin 2011-05-17 13:49:14

+1

注意你的輸出中有'real'和'api'。 「真實」會計入您的配額。 'real'是完成的實際cpu工作,以一個虛擬的1.2GHz CPU爲單位以毫秒爲單位進行測量(有關詳細信息,請參閱appengine文檔)。現在,如果你發現'real'類似於59k + cpu_ms,那麼你有一個問題,但是你只有2k,而這是每3分鐘一次,所以這個例程只會使用你的免費配額的一小部分。 – 2011-05-17 15:19:46

-7

您是否嘗試過使用nice來對別人過程好?

http://en.wikipedia.org/wiki/Nice_%28Unix%29

而且,可以肯定的你正在做批量插入,但似乎如此。

+1

不錯,適用於appengine? – Martin 2011-05-17 09:57:28

+3

應用程序引擎沒有「不錯」的概念。可怕的答案。 – 2011-05-17 13:12:06

1

這個放置很好。真的,你可能會犯錯誤的唯一方法是使用太多的RPC。你已經在使用一個。

在一個請求處理程序中存儲〜400個實體將會很昂貴。如果你想優化,我會問自己,你是否真的需要一次存儲多個實體。你能否更頻繁地運行cron作業並返回更小的批次?你實際上每行需要一個實體,還是可以用較少的實體和ListProperty完成同樣的事情?您的問題中沒有足夠的背景提供可行的建議,但需要考慮。

相關問題