1

问题:我正在处理一个需要迭代的非常大的数据集。我的程序每五分钟添加大约 1300 行信息,每行有 4 列。这意味着在一天的过程中,它每天收集大约 374,400 行信息或 1,497,600 个单元格。有 1300 行,因为程序每五分钟跟踪 1300 个项目。例如:

Item_Name       Price      Quantity_in_Stock        Maximum_Stock_Level
----------
Soap            1.00              10                     10                    
Frogs           1.25              12                     16
Pickled Yogurt  1.35               7                      8
Malodorous Ooze 6.66               6                     66

我正在尝试计算一天中每个独特商品的库存水平的变化。我目前的技术从 mysql 服务器中提取整个数据集。我依赖于项目名称、库存水平、最大库存和观察日期:

q = """SELECT Item_Name,Item_In_Stock,Item_Max,Observation_Date
    FROM DB WHERE
    Observation_Date>DATE_ADD(curdate(),INTERVAL -1 DAY) """ 


try:
    x.execute(q)
    conn.commit()
    valueValue= x.fetchall() # The entire data set
except:
    conn.rollback()

然后我遍历每个 Item_Name 并为每个项目找到所有匹配值:

for item in ItemNames:
     matching = [s for s in valueValue if item[0] in s] # item[0] is an item name, i.e. Soap, Frogs, Pickled Yogurt, etc.

之后,我想知道当天购买的商品数量。这很棘手,因为物品已重新进货,因此我必须将每个时间间隔与上一个时间间隔进行比较,以查看库存水平是否有任何变化(我不能只比较开始和结束):

for item in matching:
    if not tempValue:
        tempValue = item[1] #for first row, set value equal to first row

    if tempValue > item[1]: #if last row greater than current row
        buyCount = buyCount + (item[1]-tempValue) # Add the different to the buyCount (volume sold)
    tempValue = item[1] #set tempValue for next row comparison

这种方法有效,但速度相当慢。我将每个唯一项目(在 1300 个中)计数迭代的时间定为大约 2.2 秒。这意味着计算一整天大约需要 50 分钟。如果可能的话,我想缩短这个时间。我可以做些什么来改进这个搜索和统计功能?

编辑:我尝试让 MySQL 使用以下代码完成工作,但它实际上比使用 python 对它进行排序要慢:

for item in getnameValues: # for each item name execute the following query
    q = """SELECT Item_Name,Item_In_Stock,Item_Max,Observation_Date
       FROM DB WHERE
       Item_Name=%s and Observation_Date>DATE_ADD(curdate(),INTERVAL -1 DAY) """
 try:
    x.execute(q,item[0]) # executes the query for the current item
    conn.commit()
    valueValue= x.fetchall() 

我假设我需要一种方法来遍历 MySQL 中的所有项目,然后让它将列表列表发送回 python。对?

4

2 回答 2

2

对不起,以目前的形式,这一切看起来都非常可怕。

首先,计算结果似乎取决于您运行它们的时间。你计算从昨天开始到现在的东西,而不仅仅是昨天。即今天的记录(在运行脚本之前插入),今天和明天处理。

其次,您似乎迭代了整个数据集len(item_names)时间,即您迭代 1.5m 行的 1300 次!为什么不使用defaultdictCounter在单次迭代中进行处理?

第三,您应该更好地使用整数值而不是比较项目名称字符串。

于 2013-08-29T07:58:14.170 回答
1

为了获得更好的性能,您应该使用 mysql 编程而不是 python 编程。

如果您想控制对表的每次插入,最好在 mysql 中使用触发器。如果您想在(例如)每天结束时进行搜索或任何您想要的,您最好使用cursor

您可以通过互联网上的简单搜索在光标和触发器周围找到很多东西。顺便说一下 tutsplus.com,有一些关于它们的整洁的教程。

于 2013-08-29T06:36:25.390 回答