iT邦幫忙

0

HardwareMonitor - Day 13|幾萬筆檔案怎麼看?用 Treemap 找出空間大戶

  • 分享至 

  • xImage
  •  

Day 13|幾萬筆檔案怎麼看?用 Treemap 找出空間大戶

第一次完成檔案掃描時,我把結果做成表格,卻立刻發現不好用。幾萬筆路徑塞在一起,就算能排序,也很難理解某個大檔案位於哪個目錄,更看不出整體空間分布。維運人員需要的不是更長的清單,而是一眼找到值得往下追的區域。

我先用 build_file_distribution 把平面的檔案紀錄整理成目錄樹,再由 distribution_children 取得目前路徑的下一層內容。Treemap 用矩形面積代表容量,最大的目錄自然最醒目;點擊矩形後還能往下一層鑽取。

矩形排版由 squarified_treemap_rectangles 計算。相比單純橫切或直切,它會盡量讓矩形接近正方形,標籤較容易閱讀。畫面也不會一次塞入所有項目,而是限制主要項目數量,將剩餘內容合併呈現。

本篇學習重點

  • 將平面的檔案資料整理成目錄樹。
  • 使用 Treemap 呈現目錄與檔案占用比例。
  • 限制顯示層級,避免大量節點造成資訊過載。

重點程式碼:只取目前目錄的下一層

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 可以從根目錄逐層鑽取,而不是一次顯示幾萬筆檔案。

程式碼運作方式

  1. 從 distribution 的根節點開始,依目前路徑的每一段往 children 下鑽。
  2. 任一段不存在便回傳空清單,畫面可以顯示目錄已不存在。
  3. 找到目標節點後,只回傳下一層 children,避免一次畫出整棵樹。

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,重新安排設備增加後的閱讀順序。

連載頁
HardwareMonitor目錄

認識我們
聯繫我們


*提醒邦友,使用第三方服務/API 時,請務必評估資安風險與隱私保護
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言