在我的以前的博文關於iTunes數據,我展示了一個簡單的JMP腳本語言(JSL)程序來解析iTunes XML文件。我結束了帖子,想知道代碼是否會在我的完整13.3MB iTunes Library.xml文件上運行良好。
JSL程序在我的7KB測試文件上運行不到一秒鐘。整個13.3MB需要多長時間?花了整整90秒。花在哪裡的時間?答案就是這篇文章的重點,這是關於我的項目收集iTunes數據的系列文章的第二部分。
如何輕鬆提高腳本的性能?
之前 JMP 11,這不是一個容易回答的問題。JMP 11介紹了 JSL Profiler 。這是評估JSL計劃在逐行基礎上花費時間的好工具。
為了使用JSL Profiler,我單擊了JSL編輯器頂部的“Debug Script”圖標,然後單擊“timer”圖標將調試器置於Profiler模式。在完整的13.3MB文件上運行我的腳本顯示代碼花費在Parse XML行中,其中包括Add Row()命令。我的猜測是,大部分時間都花在更新表狀態上。

JMP中的JSL Profiler報告
我意識到我可以向數據表添加JSL消息以阻止所有更新消息。消息是:
dt <<開始數據更新;
在處理消息的數據表的末尾,我需要添加:
dt <<結束數據更新;
添加這些消息後,程序運行時間僅為13秒,而不是90秒 - 處理時間縮短了85%!
現在我需要清理一些我不想進行分析的數據。我的數據有很多記錄,詳細說明哪些曲目是播放列表的一部分。我需要向我的JSL添加一些代碼,以便不處理包含播放列表數據的標記。在我的數據中,這大約佔總數的10%。

iTunes播放列表數據
感謝JMP開發人員邁克爾赫克特用於建議我添加到JSL的以下代碼。現在,任何將“播放列表”作為文本值的“關鍵”標籤都不會被處理為數據。
OnElement(
“鍵”,
結束標記(
txt = XML Text();
如果(
過程標籤,
如果(
txt ==“播放列表”,處理標記= 0,
缺少(Num(txt)),
raw dt <<添加行(1);
raw dt:Key [Row()] = txt;
)
txt ==“Tracks”,process tag = 1
);
)
)
你可以下載我的 JSL程序來自JMP文件交換並調查您自己的iTunes數據。(下載需要免費 JMP用戶社區帳戶。)
我會保存我上一篇文章的完整數據分析,但我會給你一個預覽。下面是一個樹形圖,顯示我按流派和藝術家的聽力。我確實喜歡布魯斯斯普林斯汀,並且“強迫”我的孩子多年來一直聽他講話,甚至帶他們參加很多現場音樂會。我也喜歡歌劇,爵士和藍調。如你所見,我只喜歡音樂。

使用JMP Treemap平台按流派和藝術家計算Play的樹形圖。