2012-03-29 45 views
0

我有一個由域「日期,廣告,網站,展示,點擊」結構化行龐大的數據庫值Python的最快方法找到大數據

我用了所有的人都通過Python:

cursor.execute(select * from dabase) 
data = cursor.fetchall() 

從所有這些數據,我需要採樣只在某些網站打印已經帶來了點擊量大於零的數額時,在一定時間內所發生的廣告行,所以例如:

行( 1):(t1,ad1,site1) - > clicks = 1(t是時間)

行(2):(T2,AD1,站點1) - >點擊次數= 0

因此,在點t1的AD1和SITE1不得不點擊> 0,因此在含有AD1和站點1數據的所有點,必須採取並將其放入另一個列表,我稱其爲包含行(1)和行(2)(行(2)有0次點擊的final_list,但由於在時間t1內,ad1和site1的點擊次數> 0,所以此行必須是)

當我嘗試通過MySQL Workbench製作它時,我花了很長時間纔得到錯誤消息「丟失了與數據庫的連接」。我認爲這是因爲該表擁有近4000萬行,儘管我似乎在人們處理大量數據,但MySQL無法處理它,這就是爲什麼我使用python(實際上是爲了獲得點擊次數大於0的行在Python中花費了幾秒鐘,而通過MySQL需要花費10多分鐘,我不確定它究竟有多長時間)

然後我做的是首先選擇點廣告和網站點擊次數> 0:

points = [(row[1], row[2]) for row in data if row[4]] 
points = list(set(points)) 
dic = {} 
for element in points: 
    dic[element] = 1 

此代碼只需要幾秒鐘即可運行。具有想要的點的字典,我開始將數據插入到final_list:

final_list = [] 
for row in data: 
    try: 
     if dic[(row[1], row[2])] == 1: final_list.append(row) 
    except: continue 

但it's服用時間過長,從來就一直試圖想出一個辦法讓它走得更快。可能嗎?

我感謝任何幫助!

+1

爲什麼你不只是在查詢中做到這一點? – 2012-03-29 01:51:17

+1

有什麼理由不在數據庫上做它?我的意思是,在查詢內?數據庫經過優化,可以更快地進行這些操作。 – batbaatar 2012-03-29 01:52:25

+0

你知道SQL的where子句嗎?現在你可能根本不會使用數據庫;發揮其優勢 – 2012-03-29 02:20:23

回答

2

我知道評論已經問過爲什麼你不能在數據庫中這樣做,我也很好奇......但至少在解決你的代碼時,你可能不需要一堆中間的步驟如轉換爲列表 - >設置 - >列表 - >字典。我確定append()的列表正在殺死你,還有for循環。

這是怎麼回事?

points = set((row[1], row[2]) for row in data if row[4]) 
final_list = [d for d in data if (d[1], d[2]) in points] 

你甚至可以看到,如果這是更快地得到您的點集:

from operator import itemgetter 
from itertools import ifilter 

points = set(ifilter(itemgetter(4), data)) 
getter = itemgetter(1,2) 
final_list = [d for d in data if getter(d) in points] 

我的回答給了你的問題,你必須從SQL regularily這樣做沒有選擇的疑點利益與更好的SQL查詢

+1

令人驚歎!非常感謝你的幫助jdi!我嘗試着像你一樣做,但有一點不同:我已將集合'點'轉換爲列表,因此代碼「final_list = [d for d in data if(d [1],d [2])in點]「時間太長(仍然不知道爲什麼),但這樣做有積分不到一秒鐘......! TNX! – 2012-03-29 13:24:47

+1

設置更快,因爲它使用散列來存儲項目並測試是否有一個memeber在集合中。它不必每次都掃描整個集合。它立即知道該物品是否在其中 – jdi 2012-03-29 15:28:00

-1

您正在重新發明輪子。

在您的SELECT查詢中使用WHERE子句來過濾查詢結果。

cursor.execute("SELECT * FROM dabase WHERE clicks > 0") 

這是因爲速度快:

  • 數據庫被大量優化,使SELECT ... WHERE非常快。這將比用於在Python中複製WHERE子句的文字方式任何方法快得多。
  • 需要在SQL服務器和您之間移動較少的數據(如果您的SQL服務器位於網絡上,則很重要)。而不是讓SQL服務器將數據發送給您全部數據,其中大部分要拋出只需讓SQL服務器向您發送您實際需要的過濾數據。