2011-07-18 34 views
3

我任務是執行一個搜索功能,將通過幾個大的(幾個MB)搜索日誌文件,並返回包含關鍵字的行。日誌文件不斷添加到池中,因此每次搜索都必須是動態的。使用MemoryMappedFile在大文本文件上執行搜索是否有意義?

會是有意義的爲每個文件創建一個MemoryMappedFile,然後通過各行迭代,匹配關鍵字?如果不是,那麼更好的方法是什麼呢?

示例代碼的任何鏈接將不勝感激。

+0

在這個問題中可能會有一些有用的答案:http://stackoverflow.com/questions/2095437/c-how-do-you-search-a-large-text-file-for-a-string-without逐行 –

+0

您還可以看看boyer-moore搜索算法,以提高搜索速度 – Simon

回答

1

是。 「幾MB」不是很多,它很容易適應2 GB。

你要使用constructor that takes a mapping size因爲該文件將在時間增長。另外,我認爲您需要在每次搜索時重新創建Accessor或Stream,但我發現MSDN在這裏有點不清楚。

甲流,是微不足道的創建StreamReader和閱讀每一行。整個過程很可能會在合理的硬件上綁定I/O,因此不要首先考慮CPU優化。

1

爲什麼不只是在內存中創建一個結構合理的索引對象樹,搜索優化?

編輯:增加了一些意見後...

可能是這樣的:

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"]; 
+0

這將是很多工作,並可能是矯枉過正。 OP只有幾兆字節的搜索量,所以除非搜索量很高,否則一個簡單的內存中字符串搜索就足夠了。 –

+0

然後,這將作爲一個適當的結構化索引對象樹,優化搜索:-) –

+0

那麼我會怎麼做呢? –