網頁

2019年11月12日 星期二

Julia 字典 (Dictionary) 的應用

有次看到工程師在用別人做的 Excel巨集跑 data,這個資料是 wafer 測試完成後將需要做
Laser Trim 的座標檔匯入Excel,然後檢查是不是有重複座標,有時候一片wafer 少則幾千個 dies,多則幾萬個 dies,就算電腦等級再高跑起來也是很慢。
這時如果你是主管你該怎麼做? 該說: 好認真,辛苦了。還是: 笨死了,動作這麼慢!
這種都是典型的嘴砲主管,自己沒本事只會要求員工,我最唾棄這種人啦,偏偏老闆最喜歡
這樣的人。
好啦,上面都是廢話,今天要講的是 Julia 的內建型別:字典(Dictionary)。
字典和陣列很像,在陣列裡,索引必須是整數;但在字典裡幾乎可以是任何型別。


字典包含一組稱為鍵(key)的索引,以及一組值(value)。每個鍵都被賦予一個單一的值,就像上述例子wafer的座標是唯一的,查找是否重複這種工作就很適合用 dict 來解決。
首先,建立一個字典:
person = Dict()

將 "Peter" 這個 key 對應到值 25 存入字典:
 person["Peter"] = 25

keys函數可以傳回字典所有的鍵:
ks = keys(person)

也可以用 ∈ (輸入 \in Tab) 運算子來查看某個鍵是否出現在字典中:
"Peter" ∈ ks
true


知道了怎麼操作 Dict,現在來看一下實際的例子:

下圖左邊數字用逗號分隔是座標值,如 143,9:後面是測試資料

我將每行資料從檔案讀出後放入 array 變數中,建立一個 coord_dict
對 array 每一筆(每行)資料用正規式做判斷是否為資料行,
if occursin(r"(^\d*,\d*)(:.*$)", line)
如果是用 split 函數以 ":" 分割成座標和資料
(coord, data) = split(line, ":")
143,9:die_type=1 die_test=1 bin=1

將座標(143,9) 和值(:die_type=1 die_test=1 bin=1) 分別存入 coord,data變數

檢查 coord 是否出現在 coord_dict 字典中,如果是就印出座標與值;
如果沒有就放入字典中。

if coord ∈ keys(coord_dict)
    重複的座標資料
else
    coord_dict[coord] = data
end

程式碼如下:

我將一筆重複資料放入做測試:

執行的結果:

74024 筆資料中找出一筆重複資料,花費時間 0.138420 sec

這樣只要將重複資料刪除再存檔就可以,剩下時間就可以去喝杯咖啡了。
(之後將這程式放上 server,當測試完後自動檢查並匯出結果省去了人工檢查)

完整程式碼:
https://glot.io/snippets/fhrmy2ytzs


沒有留言:

張貼留言