[英]Large web data sets in Python - how to deal with very big arrays?
我们目前正在使用Cassandra( http://cassandra.apache.org/ )获取时间序列数据。 Cassandra读取速度非常快,但是在我们提供数据之前,我们必须对数据执行一系列计算(实际上我们正在模仿SQL的SUM和GROUP BY功能 - Something Cassandra不支持开箱即用)
我们熟悉Python(在某种程度上)并决定构建一个脚本来查询我们的Cassandra集群以及执行数学并以JSON格式呈现结果:
query = (
"SELECT query here...")
startTimeQuery = time.time()
# Executes cassandra query
rslt = cassession.execute(query)
print("--- %s seconds to query ---" % (time.time() - startTimeQuery))
tally = {}
startTimeCalcs = time.time()
for row in rslt:
userid = row.site_user_id
revenue = (int(row.revenue) - int(row.reversals_revenue or 0))
accepted = int(row.accepted or 0)
reversals_revenue = int(row.reversals_revenue or 0)
error = int(row.error or 0)
impressions_negative = int(row.impressions_negative or 0)
impressions_positive = int(row.impressions_positive or 0)
rejected = int(row.rejected or 0)
reversals_rejected = int(row.reversals_rejected or 0)
if tally.has_key(userid):
tally[userid]["revenue"] += revenue
tally[userid]["accepted"] += accepted
tally[userid]["reversals_revenue"] += reversals_revenue
tally[userid]["error"] += error
tally[userid]["impressions_negative"] += impressions_negative
tally[userid]["impressions_positive"] += impressions_positive
tally[userid]["rejected"] += rejected
tally[userid]["reversals_rejected"] += reversals_rejected
else:
tally[userid] = {
"accepted": accepted,
"error": error,
"impressions_negative": impressions_negative,
"impressions_positive": impressions_positive,
"rejected": rejected,
"revenue": revenue,
"reversals_rejected": reversals_rejected,
"reversals_revenue": reversals_revenue
}
print("--- %s seconds to calculate results ---" % (time.time() - startTimeCalcs))
startTimeJson = time.time()
jsonOutput =json.dumps(tally)
print("--- %s seconds for json dump ---" % (time.time() - startTimeJson))
print("--- %s seconds total ---" % (time.time() - startTimeQuery))
print "Array Size: " + str(len(tally))
这是我们得到的那种输出:
--- 0.493520975113 seconds to query ---
--- 23.1472680569 seconds to calculate results ---
--- 0.546246051788 seconds for json dump ---
--- 24.1871240139 seconds total ---
Array Size: 198124
我们在计算上花费了大量时间,我们知道问题不在于总和和分组本身:这只是阵列的绝对大小。
我们已经听到了关于numpy的一些好消息,但是我们数据的性质使得矩阵大小未知。
我们正在寻找有关如何处理此问题的任何提示。 包括完全不同的编程方法。
我做了一个非常类似的处理,我也担心处理时间。 我认为你没有考虑重要的事情:你从cassandra收到的结果对象,因为函数execute()
返回不包含你想要的所有行。 相反,它包含一个分页结果,并在扫描for
列表中的对象时获取行。 这是基于个人观察,但我不知道有关此的更多技术细节。
我建议你通过在execute
命令之后添加一个简单的rslt = list(rslt)
来隔离查询和处理结果,这会强制python在执行处理之前遍历结果中的所有行,同时强制cassandra驱动程序获取在进行处理之前你想要的所有行。
我想你会发现很多处理时间实际上是在查询,但是驱动程序通过分页结果掩盖了它。
Cassandra 2.2及更高版本允许用户定义聚合函数。 您可以使用它在cassandra端执行列计算。 有关用户定义聚合的数据,请参阅DataStax文章
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.