2016-11-11 102 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)中完成(可能需要幾個小時,使用合適的算法,主要受磁盤讀/寫速度限制)。

一旦你有了數組,你就可以計算出對數時間內任何子串的出現次數。在實踐中,時間將由磁盤不同部分的查找時間決定,因此如果將文件存儲在固態驅動器上,這部分速度會更快。