2016-11-11 107 views
5

我有一个50GB的随机字符串txt文件,我想从中计算该文件中子字符串的出现次数..很多次,对于不同的不是预定义的随机子字符串。Python中的概率计数

我想知道是否有另一种方法来解决这个问题。

概率方式

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

其他统计方法(?)

,我可以用它来估计在一个文本文件中的字符串中出现的次数任何假设法?打开替代品。

这将是很好,如果它可以在< =对数时间完成,因为我会做很多次相同的任务。

+0

为什么你认为你不能使用柜台?您无需提前指定密钥。即使您不想处理整个文件,也可以使用计数器对其中的一部分进行采样。 – jonrsharpe

+0

@jonrsharpeI你说得对,但我忘了补充说我没有50GB的内存。 – RetroCode

+0

计数器不会占用50gb,并且不需要一次将整个文件保存在内存中。你可以一次读一点。数完每个角色都是完全可能的。 – Carcigenicate

回答

1

一些streaming algorithms声音与这个问题有关,无论是单独的,或相互结合。

  1. 该文件的初始传递可以给出近似heavy hitters。根据你的问题,重击者的分配对你来说可能是足够的,但是这个集合足够小以便记忆。如果是这样的话,你可以执行第二轮,只计算第一轮中的重击者。

  2. count-min sketch数据结构可以执行近似计数。你可以自己使用这个数据结构,或者你可以用它来计算重击者的出现次数。

因为这个被标记为的Python:

1

你可以计算你的文件suffix array

此数组包含按排序顺序的后缀的起始位置。使用50GB的文本,您可以为每个位置分配5个字节,并以5 * 50 = 250 GB的后缀数组结尾。如果这太多了,那么你可以试试compressed suffix array

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

一旦你有了数组,你就可以计算出对数时间内任何子串的出现次数。在实践中,时间将由磁盘不同部分的查找时间决定,因此如果将文件存储在固态驱动器上,这部分速度会更快。