2010-06-01 22 views
2

我正在爲擁有大量收藏(超過100,000首曲目)的發燒友編寫媒體播放器,我的主要目標之一是搜索速度。我想允許用戶進行基於這些因素的谷歌式的搜索他們的整個音樂收藏:即時管理和搜索100,000個以上對象的有效方法? (C#)

  • 宋路徑和文件名中的ID3標籤(標題,藝術家,專輯等
  • 項目。)
  • 歌詞

什麼是對我來說,存儲這些數據,並通過它搜索的最佳方式?目前,我將每個軌道存儲在一個對象中,並遍歷這些對象的數組,根據給定的搜索文本檢查每個變量的字符串匹配。

我遇到了問題,雖然我的搜索無效,因爲它總是一個短語搜索,我不知道如何使它更模糊。像SQLlite這樣的內部數據庫會比這更快嗎?關於如何構建這個系統的任何想法?

我還需要播放列表持久性,以便當他們關閉應用程序並打開應用程序時,他們的播放列表立即加載。我應該如何存儲播放列表信息,以便在應用程序啓動時快速加載播放列表信息?目前,我是JSON編碼整個播放列表,將其存儲在一個文本文件中,並在運行時將其讀入ListView中,但它的播放速度超過20,000首曲目。

謝謝!

+2

SQLLite聽起來很合身。 – 2010-06-01 01:36:40

+1

如果你所做的一切都圍繞着對象,你可以看一個對象數據庫 - 這樣你就可以跳過JSON閱讀。那裏有不少,但我沒有足夠的經驗來提出建議。大多數但不是全部都是商業產品。 – Jay 2010-06-01 01:50:05

回答

2

幾點建議:

  1. 不讀文件到ListView中。使用MVVM模式並將文件讀入集合,讓數據綁定填充ListView。

  2. 在ListView上啓用虛擬化。

  3. 將數據加載到單獨的線程中。這樣,UI會在物品加載時響應。

  4. 對於只有100,000個項目,線性內存搜索通常可以。僅在必要時才構建索引。

  5. 在您的視圖模型中,將整個軌道列表存儲在一個字段中,並將當前過濾的軌道列表存儲在不同字段中。當過濾器發生變化時,計算一個新的過濾列表並將該屬性設置爲新值,而不是更改現有過濾收集。不要使用CollectionView進行過濾。

  6. 也許考慮使用比json更高效的數據格式。用特殊字符替換逗號的CSV變體往往是非常快速且向後兼容的。

  7. 對於搜索,請考慮將標題拆分爲單詞並搜索任何/所有單詞而不是精確短語。

8

SQLite應該可以正常工作。爲了擴展搜索功能,你可以看看Lucene.NET。關於您的大型播放列表,這些也應該存儲在數據庫中,並加載分頁(即一次50個音軌)。

0

查找到Lucene.NET的,你可以在你的應用程序方便地使用一個很好的全文搜索引擎。它是開源的,易於使用,並且有很多社區支持。

對於您的播放列表持久性,由於您已經使用JSON,請查看MongoDB。這是一個非常酷的NoSQL數據庫,它聽起來很適合你的需求,並且有.NET驅動程序可以很容易地添加到.NET應用程序中。

乾杯。

1

我已經構建了一個處理大型音樂收藏的多區域音樂播放器。我採用的方法是創建一個Tag表和一個關聯Song-Tag。我有各種各樣的標籤類型,TagArtist,TagAlbum,TagGenre,TagWord,...都來自Tag。

使用實體框架4我可以高效地查詢任何單詞,流派,標題,藝術家並獲取包含該單詞的所有歌曲。我可以通過'藝術家,標題,流派,...'中的任何詞語或者通過特定標籤類型(例如,藝術家以'X'開頭。

要處理隨機播放列表,我還會在數據庫中存儲每首歌的隨機數字。通過將今天的隨機數與數據庫中的數字進行異或(可以在數據庫中執行的操作),可以獲得有序的隨機結果。

使用LINQ to EF,您永遠不需要將整個播放列表保存在內存中,您可以使用Skip()和Take()到右側的'頁面'或單個歌曲。

我的系統也會響應自然語言查詢,如'上週播放的歌曲'或'播放藝術家:Phil',或者只是'播放X'。在博客上查看演示。

我相信它也是第一個在錯誤季節不播放季節性音樂的音樂播放器!

+0

嗨Hightechrider,是你的項目開源嗎?我無法在您的博客上找到該播放器 – 2010-06-09 17:40:13

+0

目前未打開,我在考慮它。玩家是家庭自動化系統的一部分,這裏有一個展示界面的演示。 – 2010-06-09 18:44:39

相關問題