[英]Fast search in compressed text files
我需要能夠在壓縮的大量文件(.txt)中搜索文本。 壓縮可以改為其他東西,甚至可以變成專有的。 我想避免解壓縮所有文件並壓縮(編碼)搜索字符串並在壓縮文件中搜索。 這應該可以使用霍夫曼壓縮與所有文件的相同碼本。 我不想重新發明輪子,所以..任何人都知道像這樣的庫或者實施和測試過的霍夫曼算法,或者更好的想法?
提前致謝
大多數文本文件都是使用LZ系列算法壓縮的,這些算法將字典編碼器與熵編碼器 (如Huffman)結合在一起。
因為字典編碼器依賴於不斷更新的“字典”,其編碼結果取決於歷史(字典中從輸入數據直到當前符號的所有代碼),因此無法跳轉到某個位置並開始解碼,而不首先解碼所有先前的數據。
在我看來,你可以使用一個zlib流解碼器,它可以隨時返回解壓縮數據,而無需等待整個文件解壓縮。 這不會節省執行時間,但會節省內存。
第二個建議是對英語單詞進行霍夫曼編碼,並忘記字典編碼器部分。 每個英語單詞都映射到一個唯一的無前綴代碼。
最后,@ SHODAN給出了最明智的建議,即索引文件,壓縮索引並捆綁壓縮文本文件。 要進行搜索,只需解壓縮索引文件並查找單詞。 這實際上是對單詞執行霍夫曼編碼的改進 - 一旦找到單詞的頻率(為了最佳地分配前綴代碼),您已經構建了索引,因此您可以保留索引以進行搜索。
您不太可能在壓縮文件中搜索未壓縮的字符串。 我猜你最好的選擇之一是以某種方式索引文件。 或許使用Lucene?
在壓縮文件中搜索文本比在未壓縮文本文件中搜索相同內容要快。
我見過的一種壓縮技術為了快速搜索而犧牲了一些空間:
特別是,搜索單個單詞通常會減少比較壓縮文本中的16位索引,這比在原始文本中搜索該單詞要快,因為
某些正則表達式可以轉換為另一個直接在壓縮文件中查找項目的正則表達式(也可能還會發現一些誤報)。 這樣的搜索也比在原始文本文件上使用原始正則表達式做的更少比較,因為壓縮文件更短,但通常每個正則表達式比較需要更多工作,因此它可能會或可能不會比原始正則表達式更快地運行原文。
(原則上你可以用可變長度的霍夫曼前綴代碼替換固定長度的16位代碼,正如rwong所提到的 - 生成的壓縮文件會更小,但處理這些文件的軟件會慢一點,而且更多復雜)。
對於更復雜的技術,您可能會看一下
我可能在這里完全錯了,但我認為沒有可靠的方法來搜索給定的字符串而不解碼文件。 我對壓縮算法的理解是,對應於給定字符串的比特流很大程度上取決於未壓縮文件中字符串之前的內容。 您可能能夠在給定文件中找到特定字符串的給定編碼,但我很確定它們在文件之間不一致。
這是可能的,並且可以非常有效地完成。 關於這個主題有很多令人興奮的研究,更正式地稱為簡潔的數據結構。 我建議考慮一些主題:小波樹,FM索引/ RRR,簡潔后綴數組。 您還可以有效地搜索霍夫曼編碼的字符串,正如許多出版物所證明的那樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.