第一次完成檔案掃描時,我把結果做成表格,卻立刻發現不好用。幾萬筆路徑塞在一起,就算能排序,也很難理解某個大檔案位於哪個目錄,更看不出整體空間分布。維運人員需要的不是更長的清單,而是一眼找到值得往下追的區域。
我先用 build_file_distribution 把平面的檔案紀錄整理成目錄樹,再由 distribution_children 取得目前路徑的下一層內容。Treemap 用矩形面積代表容量,最大的目錄自然最醒目;點擊矩形後還能往下一層鑽取。
矩形排版由 squarified_treemap_rectangles 計算。相比單純橫切或直切,它會盡量讓矩形接近正方形,標籤較容易閱讀。畫面也不會一次塞入所有項目,而是限制主要項目數量,將剩餘內容合併呈現。
def distribution_children(distribution, path):
node = distribution
for part in _path_module(path).parts:
node = node["children"].get(part)
if not node:
return []
return list(node.get("children", {}).values())
這段讓 Treemap 可以從根目錄逐層鑽取,而不是一次顯示幾萬筆檔案。
Windows 與 Linux 的 path parts 規則不同,所以前一步必須先選對路徑模組並正規化根目錄。
distribution = {
"children": {
"data": {"name": "data", "children": {
"backup": {"name": "backup", "size": 32},
"logs": {"name": "logs", "size": 12},
}}
}
}
print([node["name"] for node in distribution_children(distribution, "data")])
# ['backup', 'logs']
範例只取 data 的下一層,因此圖表先顯示 backup 與 logs,不會一次塞入所有檔案。讀者可以再把這兩個節點轉成圖表需要的 label 與 value。
早期演算法只依序切割長條,當某個目錄特別大時,其他項目會被壓成幾乎看不到的細線。另一個問題是 Windows 使用反斜線、Linux 使用斜線,路徑判斷混用後會把不相關目錄歸在一起。修復時先由 _path_module 選擇正確路徑規則,再用 _normal_root 與 _is_within 確認從屬關係,排版則改用 squarified 演算法。
視覺化不是把資料畫得漂亮,而是縮短「看到異常」到「找到目錄」之間的距離。
今天我學到,視覺化的價值是縮短定位問題的時間。下一篇會回到整體 Dashboard,重新安排設備增加後的閱讀順序。