【发布时间】:2012-10-03 18:51:28
【问题描述】:
我正在尝试计算文本文件中字符串的出现次数。 文本文件长这样,每个文件大约200MB。
String1 30
String2 100
String3 23
String1 5
.....
我想将计数保存到字典中。
count = {}
for filename in os.listdir(path):
if(filename.endswith("idx")):
continue
print filename
f = open(os.path.join(path, filename))
for line in f:
(s, cnt) = line[:-1].split("\t")
if(s not in count):
try:
count[s] = 0
except MemoryError:
print(len(count))
exit()
count[s] += int(cnt)
f.close()
print(len(count))
count[s] = 0 出现内存错误,
但我的计算机中还有更多可用内存。
我该如何解决这个问题?
谢谢!
更新:
我在这里复制了实际代码。
我的python版本是2.4.3,机器运行linux,内存48G左右,但是只消耗不到5G。代码停在len(count)=44739243。
更新2: 字符串可以重复(不是唯一的字符串),所以我想将字符串的所有计数相加。我想要的操作只是读取每个字符串的计数。每个文件大约有 10M 行,我有 30 多个文件。我预计这个数字不到 1000 亿。
更新3: 操作系统是 linux 2.6.18。
【问题讨论】:
-
getStringCount是什么样子的。 -
我假设
f.close()上面的三行在这里缩进不正确? -
getStringCount(line) 只返回字符串及其计数。看起来像 return line.split("\t")
-
关闭每个文件后尝试
print(len(count))和print(sys.getsizeof(count)),以了解字典的大小。 -
与内存无关:你可以使用 collections.defaultdict(int) 来简化你的代码