我编写了非常简单的脚本来合并键的计数,这些键存储为一组文本文件。所有这些都遵循以下格式:
multi word key1 count1
multi word key2 count2
...
每个文件可以包含几百万行,从而产生大小在0.1GB到2GB之间的文件。因此文件相对较大,其中许多(约100个)分组在不同的文件夹和子文件夹中。合并它们的简单方法是这两个功能:
from collections import Counter
def merge(path_to_maindir):
merged = Counter()
for root, dirs, files in os.walk(path_to_maindir):
for f in files:
file = os.path.join(root, f)
merged += load_txt_to_Counter(file)
return merged
def load_txt_to_Counter(path)
counts = Counter()
with open(path, 'r' , encoding='utf-8', errors='ignore') as file:
for line in file:
entry = line.rstrip().rsplit(maxsplit=1)
counts[entry[0]] += int(entry[1])
return counts
我用10个文件运行这个脚本(如上所述)。这些文件一起是5GB。我在具有16GB内存和python 3.4的Windows 7,Intel i7,64 Bit机器上运行此脚本。首先,脚本运行正常,CPU使用率约为40%,内存使用率稳步上升。在某些时候记忆已满。那么5GB的文本数据占用的内存是具有相同数据的Counter实例的三倍以上?我没想到。怎么样?此外,一旦内存已满,CPU使用率将降至0%。所以它正在进行交换,但CPU负载保持在0%。每隔30分钟,可能会有一个“峰值”。到12%?记忆一直都很满。
现在我知道我可以加载每个文件的一部分,创建一个较小的计数器实例并逐步添加它们或完全忽略这种方法将文件导入适当的数据库并在数据库中进行合并。这会给我一个实用的解决方案(我做了),但我的问题更多的是针对教育目的:我想现在为什么这个相当简单的脚本表现得像它一样?我是python的新手,我可能只是犯了一个愚蠢的初学者错误。
此致 Sevrino
编辑:修复拼写错误