У меня есть огромная база данных со строками, структурированными по полям «дата, реклама, сайт, показы, клики»
Я получил их все через python, используя:
cursor.execute(select * from dabase)
data = cursor.fetchall()
ОтИз всех этих данных мне нужно выбрать только те строки, которые произошли в определенное время, когда объявление, напечатанное на определенном сайте, привело к количеству кликов больше нуля, например:
row (1):(t1, ad1, site1) -> клики = 1 (t время)
row (2): (t2, ad1, site1) -> клики = 0
Таким образом, ad1 иУ site1 в точке t1 было нажатие> 0, и поэтому все точки в данных, содержащих ad1 и site1, должны быть взяты и помещены в другой список , который я назвал final_list, который будет содержать row (1) и row (2) (row (2) имеет 0 кликов, но с тех пор, как t1 ad1 и site1 имели клики> 0, поэтому эту строку также нужно брать)
Когда я пытался сделать это через MySQL Workbench, это заняло так много времени, что яполучено сообщение об ошибке «Потеряно соединение с базой данных».Я думаю, это происходит потому, что в таблице почти 40 миллионов строк, хотя мне кажется, что люди, работающие здесь с гораздо большими объемами данных, 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
Но это занимает слишком много времени, и я пытаюсь найти способ заставить его работать быстрее.Возможно ли это?
Я ценю любую помощь!