【问题标题】:Probabilistic Counting in PythonPython中的概率计数
【发布时间】:2016-11-11 20:10:33
【问题描述】:

我有一个 50gb 随机字符串的 txt 文件,我想计算其中的子字符串在该文件中出现的次数.. 很多次,对于不同的 非预定义随机子字符串。

我想知道是否有其他方法可以解决这个问题。

概率方式

类似于布隆过滤器,但不是概率成员检查,我们可以有概率计数。该数据结构将用于计数估计

其他统计方法(?)

我可以使用任何虚拟方法来估计文本文件中字符串的出现次数?对替代品持开放态度。

如果能在

【问题讨论】:

  • 为什么你认为你不能使用计数器?您无需提前指定密钥。即使您不想处理整个文件,也可以使用计数器对其中的某些部分进行采样。
  • @jonrsharpe我说得对,但我忘了补充说我没有 50gb 的内存。
  • 一个计数器不会占用 50GB,而且您不需要一次将整个文件保存在内存中。你可以一次读一点。完全可以计算每个字符。
  • 为什么你认为你需要 50 GB 的内存?文件的大小根本不重要,重要的是不同单词的数量,可能不会超过几千个,特别是如果你先应用词干提取。
  • @tobias_k 话..当然。字符的组合?

标签: python string algorithm probability stat


【解决方案1】:

一些streaming algorithms 听起来与此问题相关,无论是单独的,还是相互结合的。

  1. 文件的初始传递可以给出heavy hitters 的近似值。根据您的问题,重击者的分布可能对您来说已经足够了,但是这个集合足够小,可以保存在内存中。如果是这种情况,您可以进行第二次传球,只计算第一次传球的重击球手。

  2. count-min sketch 数据结构可以进行近似计数。您可以单独使用此数据结构,也可以使用它来计算重击者的出现次数。

由于这被标记为 Python:

【讨论】:

    【解决方案2】:

    您可以为您的文件计算 suffix array

    该数组按排序顺序包含后缀的起始位置。对于 50GB 的文本,您可以为每个位置分配 5 个字节,并最终得到一个 5*50=250 GB 的后缀数组。如果这太多了,那么你可以试试compressed suffix array

    计算这个数组可以在 O(n) 内完成(使用适当的算法可能需要几个小时,主要受磁盘读/写速度的限制)。

    一旦你有了数组,你就可以计算任何子串在对数时间内出现的次数。实际上,时间主要取决于磁盘不同部分的寻道时间,因此如果将文件存储在固态驱动器上,这部分会快得多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-12
      • 1970-01-01
      • 2021-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多