Python - 优化计算中的内存使用

时间:2016-06-27 20:27:03

标签: python python-3.x memory

我有一个大约50,000多行的日志文件。每行包含与工人有关的信息以及工人已经工作的工作ID"在一天之内。例如,

 12:36:04.357 WorkerID: ABCD has worked on JobID: EFGH

乔布斯在工作之后不会消失。并且工人可能多次从事同一工作。我需要这个程序快速有效:

  1. 在单个日志文件中查找每个WorkerID有多少个唯一的JobID
  2. 查找每个WorkerID每小时有多少个唯一的JobID
  3. 在单个日志文件中找到每个WorkerID最常用的JobIDs
  4. 这里有一些我写过的伪代码

    from collections import defaultdict
    
    def parselines(file):
        workDataHour = defaultdict(lambda: defaultdict(set))
        workData = defaultdict(list)
        for line in file:
            hour = line[0:2]
            splitline = line.split()
            workID = splitline[2]
            jobID = splitline[7]
            workDataHour[workID][hour].add(jobID)
            workData[workID].append(jobID)
    
    # Get 1) by len(Counter(workData[workID]))
    # Get 2) by looping through each hour, and doing a len(workDataHour[workID][hour])
    # Get 3) by Counter(workData[workID]).most_common(10)
    

    确定性这很快但当然没有内存效率,因为有两个map而workData包含每行中每个workID的列表,基本上是50,000多个元素。有没有更适合我的目的的数据结构?到目前为止我有什么压缩技术?像优化我的字典用法的东西?虽然现在可能没什么问题,但我希望将来能够处理1,000,000多行的代码。

1 个答案:

答案 0 :(得分:0)

您可以避免在列表的字典中添加workID。只需创建一个int设置为0和+ = 1的字典,因为密钥已经是workID。这样可以节省内存。 对于集合或某事的词典的dict同样的事情。只要忘记集合,因为它永远不会有超过1的值。只需将其设置为True即可。

from collections import defaultdict

def parselines(file):
    workDataHour = defaultdict(lambda: defaultdict(bool))
    workData = defaultdict(int)
    for line in file:
        hour = line[0:2]
        splitline = line.split()
        workID = splitline[2]
        jobID = splitline[7]
        workDataHour[workID][hour] = True
        workData[workID] += 1