我有一个大约50,000多行的日志文件。每行包含与工人有关的信息以及工人已经工作的工作ID"在一天之内。例如,
12:36:04.357 WorkerID: ABCD has worked on JobID: EFGH
乔布斯在工作之后不会消失。并且工人可能多次从事同一工作。我需要这个程序快速有效:
这里有一些我写过的伪代码
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多行的代码。
答案 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