簡體   English   中英

快速搜索壓縮文本文件

[英]Fast search in compressed text files

我需要能夠在壓縮的大量文件(.txt)中搜索文本。 壓縮可以改為其他東西,甚至可以變成專有的。 我想避免解壓縮所有文件並壓縮(編碼)搜索字符串並在壓縮文件中搜索。 這應該可以使用霍夫曼壓縮與所有文件的相同碼本。 我不想重新發明輪子,所以..任何人都知道像這樣的庫或者實施和測試過的霍夫曼算法,或者更好的想法?

提前致謝

大多數文本文件都是使用LZ系列算法壓縮的,這些算法將字典編碼器熵編碼器 (如Huffman)結合在一起。

因為字典編碼器依賴於不斷更新的“字典”,其編碼結果取決於歷史(字典中從輸入數據直到當前符號的所有代碼),因此無法跳轉到某個位置並開始解碼,而不首先解碼所有先前的數據。

在我看來,你可以使用一個zlib流解碼器,它可以隨時返回解壓縮數據,而無需等待整個文件解壓縮。 這不會節省執行時間,但會節省內存。

第二個建議是對英語單詞進行霍夫曼編碼,並忘記字典編碼器部分。 每個英語單詞都映射到一個唯一的無前綴代碼。

最后,@ SHODAN給出了最明智的建議,即索引文件,壓縮索引並捆綁壓縮文本文件。 要進行搜索,只需解壓縮索引文件並查找單詞。 這實際上是對單詞執行霍夫曼編碼的改進 - 一旦找到單詞的頻率(為了最佳地分配前綴代碼),您已經構建了索引,因此您可以保留索引以進行搜索。

您不太可能在壓縮文件中搜索未壓縮的字符串。 我猜你最好的選擇之一是以某種方式索引文件。 或許使用Lucene?

在壓縮文件中搜索文本比在未壓縮文本文件中搜索相同內容要快。

我見過的一種壓縮技術為了快速搜索而犧牲了一些空間:

  • 維護一個字典,其中包含文本中每個單詞的2 ^ 16個條目。 保留文字字節的前256個條目,以防你遇到一個不在字典中的單詞 - 即使許多大文本的單個字少於32,000個,所以它們永遠不需要使用這些字面字節。
  • 通過將16位字典索引替換為每個單詞來壓縮原始文本。
  • (可選)在正常情況下,兩個單詞由單個空格字符分隔,丟棄該空格字符; 否則將單詞之間的字符串中的所有字節放入字典中作為特殊的“單詞”(例如,“。”和“,”和“\\ n”)標記為“無默認空格”屬性,然后“壓縮” “用相應的字典索引替換它們的那些字符串。
  • 通過以相同方式壓縮短語來搜索單詞或短語,並在壓縮文本中搜索壓縮的字節串,其方式與在原始文本中搜索原始字符串的方式完全相同。

特別是,搜索單個單詞通常會減少比較壓縮文本中的16位索引,這比在原始文本中搜索該單詞要快,因為

  • 每次比較都需要比較更少的字節 - 2,而不是那個字中有多少字節,和
  • 我們進行的比較較少,因為壓縮文件較短。

某些正則表達式可以轉換為另一個直接在壓縮文件中查找項目的正則表達式(也可能還會發現一些誤報)。 這樣的搜索也比在原始文本文件上使用原始正則表達式做的更少比較,因為壓縮文件更短,但通常每個正則表達式比較需要更多工作,因此它可能會或可能不會比原始正則表達式更快地運行原文。

(原則上你可以用可變長度的霍夫曼前綴代碼替換固定長度的16位代碼,正如rwong所提到的 - 生成的壓縮文件會更小,但處理這些文件的軟件會慢一點,而且更多復雜)。

對於更復雜的技術,您可能會看一下

我可能在這里完全錯了,但我認為沒有可靠的方法來搜索給定的字符串而不解碼文件。 我對壓縮算法的理解是,對應於給定字符串的比特流很大程度上取決於未壓縮文件中字符串之前的內容。 您可能能夠在給定文件中找到特定字符串的給定編碼,但我很確定它們在文件之間不一致。

這是可能的,並且可以非常有效地完成。 關於這個主題有很多令人興奮的研究,更正式地稱為簡潔的數據結構。 我建議考慮一些主題:小波樹,FM索引/ RRR,簡潔后綴數組。 您還可以有效地搜索霍夫曼編碼的字符串,正如許多出版物所證明的那樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM