2009-10-09 99 views
1

我使用VB.Net,我有一套數據,我必須能夠相當快地過濾。基本上,該程序就像谷歌Sugest,但不是一個下拉菜單,我使用的是一個列表框。當用戶輸入一個單詞時,我會比較使用LINQ的單詞並過濾那些包含用戶輸入的單詞。數據都是可變長度的字符串(從0到200個字符,大多數在150個字符標記上),並且我有240,000多個字符串和計數 - 全部存儲在XML文件中。我應該在應用程序啓動時將所有內容加載到內存中嗎?

我的一位同事告訴我,將所有內容加載到內存中(使用VB.Net的XML串行器加上字符串/對象集合)是不實際的,並且會減慢程序的「啓動」時間。我還沒有完成這個程序,我對繼續這個道路有了第二個想法。

所以,我的問題是:我應該繼續我目前的問題(這是一切加載到存儲器上啓動),或者是有解決我的困境的一種更好的方式方法呢?

回答

4

如果你想阻止的啓動時間,並保持它在內存中是在性能上沒有問題,然後異步加載它。儘管從XML中加載240.000多個字符串並將其保存在內存中聽起來並不是最好的想法。可能數據庫會是更好的方法。或者至少有一些像JSON這樣的解析速度更快的格式。

+2

+1使用數據庫。另外,這是.NET中'BackgroundWorker'組件的很好的候選者 - 它確實應該做異步。 – 2009-10-09 22:39:15

+2

做這種事情異步可能會被高估。如果用戶無法用應用程序做任何事情*直到整個數據集被加載並可搜索,那麼異步加載是沒有意義的。不過,數據庫是個好主意。 – MusiGenesis 2009-10-09 22:54:36

+0

@MusiGenesis那麼,如果這是當然的情況。但是如果兩者之間存在一個頁面,或者需要執行某些其他操作(例如在訪問特定區域之前填充其他字段),則可以避免用戶查看等待應用程序加載的啓動屏幕。 – 2009-10-09 23:12:23

0

取決於很多事情:

If 
((you know the strings will not hugely increase in number) && 
(you know the spec of the machines that will run your app) && 
(you are able to test that the load time is *good enough* on the above spec)) 
{ 
**don't bother changing approach.** 
} 
else 
{ 
**change approach.** 
} 

另一種方法顯然是某種非同步延遲加載的。

+0

-1(虛擬)爲你的蛇Plissken頭像。 – MusiGenesis 2009-10-09 22:56:11

+0

我認爲你不是粉絲:) – JohnIdol 2009-10-09 23:15:18

0

你在談論加載大致字符串36MB。雖然這不是一個令人生畏的數量(儘管你可以更快地讀取XML來加載它......如果我擔心性能,我不會使用序列化引擎),但這也是一個不重要的數量。假設你不像Mircea所說的那樣異步執行,你正在尋找一個啓動時間加上幾秒鐘的時間。

如果你不這樣做異步,你必須確保它依賴於數據的任何UI過程中不會發生,直到它加載之後。這可能是一個難以確保的事情。

0

它可能不是一個壞主意,當應用程序啓動時將XML加載到內存中。但如果你走這條路線,我會考慮使用BackgroundWorker線程。這個想法是將XML加載到內存中,以便UI在這種情況下仍然能夠響應。就用戶而言,應用程序不應該開始慢一點,但一旦完成,類似Google的建議功能應該會顯着加快。

我必須說,即使在內存中,這是一種固有的低效操作,因爲在以這種方式查詢XML文件時沒有使用索引的優勢。這是在full-text searching SQL中快10倍的東西。

當然XML中具有作爲自包含的,無需附加的部件的優點。這使它成爲查詢少量數據的小型桌面應用程序的不錯選擇。否則,我會考慮使用數據庫來獲得更好的性能。

0

這個問題似乎意味着一個在線應用。一些建議,如果是這樣的話:

  • 數據可以/應該是拉鍊。我懷疑它會非常好地壓縮。
  • 也許數據可能是緩存在多個會話中,可能作爲html內容與適當的過期緩存日期交付。這將節省系統負載,並且如果數據不經常更新,則可能是可行的。
  • 建議功能特徵可以(在應用程序初始化緩存,異步即說呈現出「加載...」消息)進行初始禁用。以這種方式,即使建議功能可能滯後達30秒左右,該應用程序在啓動時也可快速使用。

編輯:獨立的數據如何被下載並緩存,我秒米爾恰Grelus的認爲,這種規模的xml文件是數據庫的一個貧窮的替代品。

0

通過使用二進制序列化而不是XML序列化可以更好地服務於保存應用程序在啓動時讀取的數據,特別是如果您最終實現的搜索速度比「StringCollection」快。當然,您仍然可以在某處維護數據的XML版本。

通過一切手段,使用BackgroundWorker來異步加載數據,如果這會讓您的應用程序感覺更具響應性。

相關問題