2012-10-05

[C#] 如何從大量JSON檔案中找尋關鍵字 (Regular Expression篇)

 

上一篇文章 如何從大量 JSON 檔案中找尋關鍵字 (JSON.net 還原篇)

提到在十萬筆資料下面,對某一欄位 (案例為 Memo 欄位) 的內容進行關鍵字搜尋..

可以搜尋出我要的關鍵字資料,拿去給老闆看…

 

老闆問我說,你這 2x 秒鐘的搜尋有啥用嗎?!

所以我在想…

如何才能夠更快..

我發現其實問題可能出在.. 關於我把 JSON 還原成物件時候耗費太多時間..

是否可以再讀取出字串的時候進行搜尋,但是我還要針對指令欄位也..

這時候腦袋想到的就是 Regular Expression

介紹範例資料 (前情提要)

首先我在 Source 這檔案夾下面建立 10 萬筆資料,不多,但是也不太少,但是產生跟複製的時候足以讓我電腦 hang 住..

這資料結構長這樣

{
"Id":"4",
"Memo":"的,你快挖了丁老賊的眼珠出來,給我報仇。」蕭峰一時難以明白其間真相,目光環掃,在人君中見到了段正淳和",
"Birthday":"1900-01-05T00:00:00",
"Age":4
}

上述為了顯示好看在資料中是無分行的 JSON 資料 命名從 1~100000 所以 Id 跟檔名相同,Age 也是,至於 Memo 資料


1~50000 是從金庸小說天龍八部隨機取出 50 字,50000~100000 是從金庸小說射鵰英雄傳裡面隨機取出 50 字,做成測試資料..


所以您可以透過 段譽、蕭峰等關鍵字搜尋 您可以搜尋出 1~50000 的資料,如果是搜尋 郭靖、黃蓉、洪七公 你會搜尋到 50001~100000 的資料


我在 1,1199,49999,99999 的 Memo 欄位中都加上了當麻的字樣,方便我進行測試…


ps. 下載範例時候,可以下載到這 100000 個檔案,解壓縮的時候可能會花一點時間。


使用 Regular Expression 進行搜尋


C# Code :



// 使用 Stopwatch 進行監看花費時間
Stopwatch stopwatch = new Stopwatch();
// 監看開始
stopwatch.Start();
var sourceDirectoryInfo = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory + "\\Source\\");
//Regular Exprssion : "Memo":"(.*?)keyword(.*?)"
// 開檔後直接透過 Regex 進行比對
var  allObjects =
  (from n in sourceDirectoryInfo.GetFiles().Select(x => File.ReadAllText(x.FullName))
  where new Regex("\"" + "Memo" + "\":\"(.*?)" + txtKeyword.Text + "(.*?)\"", RegexOptions.IgnoreCase).IsMatch(n)
  select n).ToArray();
// 監看結束
stopwatch.Stop();
Response.Write("花費時間:" + stopwatch.Elapsed + "<br /><hr />");
Response.Write("資料比數:" + allObjects.Length + "<br /><hr />");
Response.Write("Result:<br />");
foreach (dynamic obj in allObjects)
{
    var userInfo = JsonConvert.DeserializeObject(obj);
    Response.Write("Id:" + userInfo.Id + "  Memo=" + userInfo.Memo.ToString().Replace(txtKeyword.Text, "<span style='color:red'>" + txtKeyword.Text + "</span>") + "<br />");
}

結果:



搜尋 關鍵字 當麻


sshot-21_2


連續測試五次分別時間為:


第一次:花費時間:00:00:19.1214572
第二次:花費時間:00:00:22.1234941
第三次:花費時間:00:00:19.0326399
第四次:花費時間:00:00:18.4193905
第五次:花費時間:00:00:18.3237237



搜尋關鍵字 黃蓉


sshot-22_2


花費時間:00:00:30.0680597



搜尋 關鍵字 段譽


sshot-23_2


花費時間:00:00:39.1202335



結論


跟上次測試把物件還原,不分上下,在搜尋資料少的時候,或許比較快,但是事實上,依然還是很慢…


依然失敗~~ 因為搜尋時間可能還會更久…XD..


 


ps 特別感謝 91 哥 提醒我延遲執行 問題 解開我測試答案怪怪的疑惑


範例下載