簡體   English   中英

在大文件中搜索的最佳方法是什么?

[英]What is the best way to do a search in a large file?

我希望將KMP(或類似)搜索應用於大文件(> 4GB)。

我希望這會給我帶來麻煩。我無法將它全部復制到內存中,因為那里沒有足夠的空間。

我的問題是,進行此搜索的最佳方法是什么? 我應該簡單地創建一個FILE *並直接在文件中進行搜索,我應該將塊(比如說4k)復制到內存中並搜索那些或其他完全的內容嗎?

如果您使用的是支持它的平台,則可以使用mmap()。 文件的分頁也是可能的,但請記住保持緩沖區盡可能大以減少IO開銷,並在兩個頁面的邊界之間要小心(假設字符串匹配,但被頁面邊界分割)

或者,我建議您構建某種索引,並使用索引來限制搜索。 KMP搜索效率不高。 這當然取決於文件的性質,創建方式等。

對於文件訪問,我建議使用內存映射文件來避免數據復制。 在unix機器上它是微不足道的。 如果無法在一個塊中分配文件映射,則可能必須將文件映射拆分為較小的塊。 如果您有興趣,我可以提供一些代碼。

對於搜索,我建議使用Boyer More搜索算法

直接在文件中搜索會非常慢,使用緩沖會提供更好的性能。 但請注意,您的緩沖區必須大於您搜索的內容( SearchLength ),當然,您必須在結束前的SearchLength字節時刷新緩沖區。

最好的方法是用塊讀取它並搜索它。 您應該將塊大小作為參數,以便您可以嘗試提供最佳性能的內容。

但是,嘗試以某種方式索引文件通常更有效,這樣您就不必線性搜索整個文件。 例如,KMP是一種字符串搜索算法 - 你只是在尋找單詞的出現嗎? 然后,您可以在文件中創建單詞的哈希表(在磁盤上)及其位置,並進行非常有效的搜索。

暫無
暫無

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

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