繁体   English   中英

Python在大数据中寻找价值的最快方法

[英]Python fastest way to find values in big data

我有一个庞大的数据库,其中的行由“日期,广告,网站,展示次数,点击次数”字段构成

我通过使用以下命令通过python获得了所有这些:

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

从所有这些数据中,我只需要抽样在特定时间打印的广告在特定网站上产生的点击量大于零的行,因此,例如:

row(1):(t1,ad1,site1)->点击次数= 1(t是时间)

第(2)行:(t2,ad1,site1)->点击次数= 0

因此,在点t1处的ad1和site1的点击次数> 0,因此必须将包含ad1和site1的数据中的所有点都放入另一个列表中 ,我将其称为final_list,该列表将包含row(1)和row(2)(row( 2)点击次数为0,但由于在时间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

但这花了太长时间,我一直在努力寻找一种使它运行更快的方法。 可能吗?

感谢您的帮助!

我知道评论已经问到了为什么您不能仅在数据库中执行此操作,我也想知道...但是至少要解决您的代码,您可能不需要中间的一堆步骤例如转换为列表->设置->列表->字典。 我确定列表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查询从sql定期执行此操作的好处。

您正在重新发明轮子。

SELECT查询上使用WHERE子句可以过滤查询结果。

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

这是更快的,因为:

  • 数据库经过高度优化,以使SELECT ... WHERE非常快。 它实际上比您在Python中复制WHERE子句所使用的任何方法都要快得多。
  • 只需较少的数据就可以在SQL Server和您之间移动(如果SQL Server在网络上,则很重要。)与其让SQL Server发送所有数据(大部分将要丢弃的数据),不如让它发送SQL Server向您发送您实际需要的过滤数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM