我任務是執行一個搜索功能,將通過幾個大的(幾個MB)搜索日誌文件,並返回包含關鍵字的行。日誌文件不斷添加到池中,因此每次搜索都必須是動態的。使用MemoryMappedFile在大文本文件上執行搜索是否有意義?
會是有意義的爲每個文件創建一個MemoryMappedFile,然後通過各行迭代,匹配關鍵字?如果不是,那麼更好的方法是什麼呢?
示例代碼的任何鏈接將不勝感激。
我任務是執行一個搜索功能,將通過幾個大的(幾個MB)搜索日誌文件,並返回包含關鍵字的行。日誌文件不斷添加到池中,因此每次搜索都必須是動態的。使用MemoryMappedFile在大文本文件上執行搜索是否有意義?
會是有意義的爲每個文件創建一個MemoryMappedFile,然後通過各行迭代,匹配關鍵字?如果不是,那麼更好的方法是什麼呢?
示例代碼的任何鏈接將不勝感激。
是。 「幾MB」不是很多,它很容易適應2 GB。
你要使用constructor that takes a mapping size因爲該文件將在時間增長。另外,我認爲您需要在每次搜索時重新創建Accessor或Stream,但我發現MSDN在這裏有點不清楚。
甲流,是微不足道的創建StreamReader和閱讀每一行。整個過程很可能會在合理的硬件上綁定I/O,因此不要首先考慮CPU優化。
爲什麼不只是在內存中創建一個結構合理的索引對象樹,搜索優化?
編輯:增加了一些意見後...
可能是這樣的:
class Index
{
public Dictionary<string, List<SourceFile>> FilesThatContainThisWord {get; set;}
...
}
class SourceFile
{
public string Path {get; set;}
...
}
// Code to look up a term
var filesThatContainMonday = myIndex.FilesThatContainThisWord["Monday"];
這將是很多工作,並可能是矯枉過正。 OP只有幾兆字節的搜索量,所以除非搜索量很高,否則一個簡單的內存中字符串搜索就足夠了。 –
然後,這將作爲一個適當的結構化索引對象樹,優化搜索:-) –
那麼我會怎麼做呢? –
在這個問題中可能會有一些有用的答案:http://stackoverflow.com/questions/2095437/c-how-do-you-search-a-large-text-file-for-a-string-without逐行 –
您還可以看看boyer-moore搜索算法,以提高搜索速度 – Simon