python中高效的字频计数,用于单机大规模处理

python中高效的字频计数,用于单机大规模处理,python,word-frequency,Python,Word Frequency,我有一个包含字符串内容的巨大文本文件。我的用例是识别单词及其对应的计数 在python中,实现这一点的常规方法是使用字典并跟踪单词及其计数。还有另一种使用集合计数器查找最常用单词的方法 上述方法可以很好地工作,但它不节省空间,因为dict的大小将是唯一单词的总数。 有没有其他有效的算法可以在一台机器上找出大数据的字数基数?i、 e.如果不使用像Hadoop Map reduce或Spark这样的分布式计算?好吧,我认为你无法通过这种或那种方式来存储唯一单词的总数collections.Count

我有一个包含字符串内容的巨大文本文件。我的用例是识别单词及其对应的计数

在python中,实现这一点的常规方法是使用字典并跟踪单词及其计数。还有另一种使用集合计数器查找最常用单词的方法

上述方法可以很好地工作,但它不节省空间,因为dict的大小将是唯一单词的总数。
有没有其他有效的算法可以在一台机器上找出大数据的字数基数?i、 e.如果不使用像Hadoop Map reduce或Spark这样的分布式计算?

好吧,我认为你无法通过这种或那种方式来存储唯一单词的总数<正如您所提到的,code>collections.Counter可能是最简单的方法

如果内存使用有问题,您可以尝试将结果存储在numpy数组中,尽管对于这种特殊情况来说,它不是非常合适/最佳的

此外,无论数据集有多大,只有(可能只有10%的数据集被积极使用),因此假设平均长度为每个字10个字符,每个字符1个字节,相应的内存大小在C中只有~10MB,也就是说,考虑到Python开销和unicode,可能只有~100MB。实际上,生成一个包含10**6个随机10个字符长的单词的dict需要115MB,所以在任何现代系统上存储都不会有问题

In [14]: import string
    ...: import random
    ...: import itertools
    ...: %load_ext memory_profiler
    ...:
    ...: def gen_dict(n):
    ...:     out = {}
    ...:     for i, name in enumerate(itertools.product(string.letters, repeat=10)):
    ...:         if i > n: break
    ...:         out[''.join(name)] = random.randint(0, N)
    ...:     return out
    ...:
    ...: N = 1000000
    ...: %memit x = gen_dict(N)
    ...: print(len(x.keys()))
    ...: 
peak memory: 150.45 MiB, increment: 116.52 MiB
1000001

修改的标记化方法可能会产生多词标记,这很容易导致字典大小远远大于10**6。 由于请求的解决方案似乎只涉及将所有令牌存储在内存中,因此基于Trie的存储而不是dict就足够了

看看哪个说

对于共享前缀的键,它通常比Python使用更少的内存 格言

不过,在速度上会有一些牺牲。其他此类数据结构包括datrie、marisa trie和DAWG


您可以使用多进程加速计数。

您是否遇到了内存问题(这会令人惊讶),或者您只是想知道是否有一种方法可以记录给定单词出现了多少次而不跟踪该值(没有)?谢谢。但是,是否有任何直观的方法可以使用位集方法来查找单词的基数?