2013-03-10 69 views
0

我正在構建一個小工具,我想掃描音樂集合,讀取曲目的ID3信息並存儲它,只要該特定藝術家沒有一首歌曲具有被訪問了兩次以上。我打算使用Mutagen來閱讀標籤。優化質量ID3標籤掃描

但是,我自己和其他人的音樂收藏量很大,超過2萬首歌曲。據我所知,像Mutagen這樣的圖書館必須打開並關閉每首歌曲才能從中獲得ID3信息。雖然MP3的性能不是很高,但這是很多歌曲。我已經計劃對每位藝術家進行一次小小的優化,如果他們的歌曲數量超過2,則不會存儲任何信息,但據我所知,我仍然需要打開每首歌曲以檢查藝術家ID3標記。

我玩弄了使用目錄作爲藝術家名字提示的想法,並且一旦藝術家的歌曲數量超過2就不會讀取該目錄中的任何更多信息,但並非每個人都將他們的音樂設置在整齊的藝術家/專輯/歌曲目錄。

有沒有人有任何其他優化的想法,可能會減少打開這麼多MP3的開銷?

回答

1

請注意不成熟的優化。你確定這會是一個性能問題嗎?你的要求是什麼 - 腳本需要多快運行?用天真的方法運行有多快?在優化之前進行配置和評估。我認爲你很可能看到一個沒有實際存在的性能問題。

如果你想保證正確的答案,你不能避免訪問每個文件一次。如您所見,完全跳過文件的優化基本上等於自動猜測。

您是否可以保留之前掃描的記錄,並在隨後的掃描中使用文件的上次修改日期以避免重新掃描已經掃描過的文件?這可能意味着您的第一次掃描可能需要一點時間,但後續掃描會更快。

如果您需要快速對音樂集合進行大量複雜查詢,請考慮將整個集合的元數據導入數據庫(例如SQLite或MySQL)。導入需要時間 - 更新插入新文件將需要一點時間(檢查上面修改過的日期)。然而,一旦數據存在於你的數據庫中,假設數據庫設置合理,所有事情都應該相當快速。

+1

打到數據庫並從磁盤讀取很多I/O。一旦它進入它,但在那裏它可能需要很長時間。 – Makoto 2013-03-10 17:28:20

1

通常,對於這個問題,我建議你使用的檢測藝術家或曲目標題多種方法:檢查

1路:是文件名也許在藝術家TITLE.mp3格式? (或類似)
(文件名,這將是「藝術家Track.mp3」)

for file in os.listdir(PATH_TO_MP3s): 
    artist = re.split("[\_\-\.]", file)[-3] 
    track = re.split("[\_\-\.]", file)[-2] 
    filetype = re.split("[\_\-\.]", file)[-1] 

當然,你必須確保,如果該文件是在格式第一。

第2步(如果第一次不適合該文件),如果該目錄名稱適合(像你說的)將被檢查

第三和最後一個是檢查ID3標籤。

但請務必在信任它之前檢查值是否正確。
例如,如果有人會使用「Track-Artist.mp3」作爲我提供的藝術家和曲目將被切換的代碼。