【发布时间】:2014-08-25 16:04:58
【问题描述】:
我必须从一个大文件中计算数据。文件有大约 100000 行和 3 列。 下面的程序适用于小测试文件,但是当尝试使用大文件运行时,即使显示一个结果也需要很长时间。任何加快大数据文件加载和计算的建议。
代码:小测试文件完美计算,输入格式如下
from collections import defaultdict
paircount = defaultdict(int)
pairtime = defaultdict(float)
pairper = defaultdict(float)
#get number of pair occrences and total time
with open('input.txt', 'r') as f:
with open('output.txt', 'w') as o:
numline = 0
for line in f:
numline += 1
line = line.split()
pair = line[0], line[1]
paircount[pair] += 1
pairtime[pair] += float(line[2])
pairper = dict((pair, c * 100.0 / numline) for (pair, c) in paircount.iteritems())
for pair, c in paircount.iteritems():
#print pair[0], pair[1], c, pairper[pair], pairtime[pair]
o.write("%s, %s, %s, %s, %s\n" % (pair[0], pair[1], c, pairper[pair], pairtime[pair]))
输入文件:
5372 2684 460.0
1885 1158 351.0
1349 1174 6375.0
1980 1174 650.0
1980 1349 650.0
4821 2684 469.0
4821 937 459.0
2684 937 318.0
1980 606 390.0
1349 606 750.0
1174 606 750.0
【问题讨论】:
-
与其构建一个字典然后对其进行迭代以将结果写入文件,只需将它们当场写入文件即可。
-
我无法理解
pairper背后的逻辑,您是否会在第一个 for 循环的每次迭代中覆盖它?另外,我认为有一些错误,因为您在该行中使用了变量c,但它实际上是稍后定义的。最后,正确缩进代码也会有所帮助。 -
我和@javidcf 在一起-您正在为每一行重新创建pairper dict,并且只使用最后一个。那是为了丢弃而创建的 99999 个字典。随着paircount的增加,构建dict的成本也会上升。我也不确定它应该做什么。
-
我知道我们曾经在 70 年代后期吹嘘拥有 100,000 行和 3 列的文件。无论如何,您实际上想做什么?请用文字解释。
-
@SitzBlogz 我在发布时没有仔细阅读您的代码。我没有注意到你的 for 循环中有“字典理解”。这在 O(n.log n) 中。不是吗?
标签: python data-files