--- tags: 2020_OS_HW2, zh-TW --- # 2020_OS_Fall_HW2: ETL process :::info **繳交期限:10/05-10/26 13:00** ::: ### I. 作業目標 * 請撰寫一支以多執行緒(Multi-Thread)開發的轉換程式,其功能是將CSV檔案轉換並輸出成JSON檔案。 * 請觀察及分析程式執行期間,包括但不限於CPU、Memory、Disk I/O的使用情況,探討作業系統是如何服務我們的程式。 --- ### II. 測試資料 > 請撰寫一支程式,自行產生出符合以下條件的測試資料,做為此次作業的輸入資料。 * 請在**單一檔案**產生N筆資料,每筆資料包含**20個**亂數值,並滿足以下條件: * 亂數範圍: -2147483648 ~ 2147483647 即 -2^31^ ~ 2^31^-1 (4 bytes int) * 每個亂數值以`|`字符分隔,每筆資料以`換行字符(LF)`分隔。 * 測試資料的檔案大小至少為1GB,意即你所撰寫的程式至少要能夠處理到此大小的測資。 * 請以`UTF-8`的字元編碼儲存,並將此測資檔案命名為`input.csv`。 你所產生的測試資料(input.csv),應該會長得像這樣: ```csv=-1 1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20 2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21 3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22 4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23 ...(略) ``` --- ### III. CSV to JSON轉換程式 **請撰寫一支能將CSV格式轉換成JSON格式的轉換程式,且必須滿足以下基本要求:** 1. 必須能正確地將CSV檔案內的資料轉換為JSON格式並輸出。 * 輸入資料的檔名需命名為`input.csv`。 * 轉換後的輸入資料需命名為`output.json`。 2. **必須以多執行緒(Multi-Thread)開發,並在執行指令中包含`threads`參數,可供動態調整程式所用的執行緒(thread)數量。** 3. 必須能夠處理符合前項所定義之測試資料條件的輸入資料。 * 輸入資料檔案(input.csv)中包含數筆亂數資料。 * 每筆資料需含有**20個亂數值**,並以 | 字符分隔。 4. 必須能夠處理檔案大小為1GB的輸入資料(input.csv)。 5. 輸入資料中的每筆數值資料,轉換成JSON時,請以`col_{INDEX}`做為KeyName。 6. 輸入資料(input.csv)會與程式執行檔在相同的目錄下,因此不必有設置輸入資料路徑的參數。 * "./input.csv" 7. 當CSV檔案轉換成JSON格式後,必須與原本CSV資料的排序相同,亦即CSV的第一列為JSON的第一個Object,以此類推。 8. 請勿在轉換程式中,**強制包含**產生測試資料的流程,因為助教會使用自己的輸入資料(input.csv)。 9. 不要求輸出JSON的排版,格式正確即可。 **(選擇性)你也可以使用GPU開發CUDA程式來完成本項作業。** **範例輸入(input.csv):** ```csv= 1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20 2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21 3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22 4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23 ``` **範例輸出(output.json):** ```json= [ { "col_1":1, "col_2":2, "col_3":3, "col_4":4, "col_5":5, "col_6":6, "col_7":7, "col_8":8, "col_9":9, "col_10":10, "col_11":11, "col_12":12, "col_13":13, "col_14":14, "col_15":15, "col_16":16, "col_17":17, "col_18":18, "col_19":19, "col_20":20 }, { "col_1":2, "col_2":3, "col_3":4, "col_4":5, "col_5":6, "col_6":7, "col_7":8, "col_8":9, "col_9":10, "col_10":11, "col_11":12, "col_12":13, "col_13":14, "col_14":15, "col_15":16, "col_16":17, "col_17":18, "col_18":19, "col_19":20, "col_20":21 }, { "col_1":3, "col_2":4, "col_3":5, "col_4":6, "col_5":7, "col_6":8, "col_7":9, "col_8":10, "col_9":11, "col_10":12, "col_11":13, "col_12":14, "col_13":15, "col_14":16, "col_15":17, "col_16":18, "col_17":19, "col_18":20, "col_19":21, "col_20":22 }, { "col_1":4, "col_2":5, "col_3":6, "col_4":7, "col_5":8, "col_6":9, "col_7":10, "col_8":11, "col_9":12, "col_10":13, "col_11":14, "col_12":15, "col_13":16, "col_14":17, "col_15":18, "col_16":19, "col_17":20, "col_18":21, "col_19":22, "col_20":23 } ] ``` --- ### IV. 如何開始 1. 請依照 **II.** 的說明,產生出撰寫此作業需要使用的輸入資料`input.csv`。 2. 請撰寫一支「CSV to JSON」的轉換程式,須符合 **III.** 所述之基本要求,並將執行後的結果儲存為`output.json`。 3. 請使用任意工具或方法分析、觀察你所撰寫的程式,並優化你的程式(例如:降低執行時間)。 * 試著用盡電腦的計算能力,讓它集中在處理你的程式上,以電腦閒置資源最小化為目標。 4. 將你所觀察到的現象,試著思考作業系統背後的行為,撰寫出一份完整的效能分析報告。 * 此部分的內容將會是作業評分的重點,盡你所能說明的越詳盡越好。 * 請嘗試往觀察CPU、Memory、Disk I/O的使用情形著手,對上述系統資源的觀察,並試著去結論作業系統應該要如何服務該些程式,使每隻程式能得到最好的服務。 6. 將你撰寫的程式碼及說明文件,依照作業繳交的規定,於期限內上傳到Moodle平台。 --- ### V. 說明文件 > 說明文件的格式不拘,你也可以使用Markdown來完成。 > 你在撰寫此份說明文件時,必須要包含下列基本內容。 **學號: 姓名: 系級:** **開發環境:** * OS: Ubuntu 20.04.1 * CPU: Intel® Core™ i7-10700 CPU @ 2.90GHz × 16 * Memory: 32GB * Programming Language(version): Java 1.8.0_261 * 必須包含版本資訊 **程式執行時間:** * 請在你的程式中加入量測執行時間的程式碼,以精準的獲取此數值。 * 請測量不同執行緒(thread)數量下程式的執行時間。 **程式開發與使用說明:** * 你是如何開發這支程式,程式在處理資料的流程及邏輯為何? * 你的程式該如何使用,請詳細說明執行的步驟。 * 輸入資料(input.csv)會與程式執行檔在相同的目錄下,因此不必有設置輸入資料路徑的參數。 ```bash= # (重要)請確保助教能夠按照此步驟執行你的程式。 # 在程式執行的指令中,請提供可設置執行緒(thread)數量的參數。 # Java Example # Compile $ javac ./YourSourceCode.java # Run $ java ./YourSourceCode [threads] ``` **效能分析報告:** > 分析報告的內容建議包含以下內容,但你也可以自由發揮。 > 此部分的內容將會是作業評分的重點,盡你所能說明的越詳盡越好。 * **在運行你所開發的「CSV to JSON」轉換程式下:** * 請觀察程式執行期間各個Stage對電腦資源使用情形。 * Stage最少會包含讀檔、資料處理、輸出三個階段。 * 請觀察並比較不同執行緒(thread)數量下,程式的執行狀況、系統資源的使用。 * 請觀察系統效能以及OS是如何服務我們的程式,並結論OS的設計要提供哪些優化服務。 * 你可以搭配圖片、圖表或外部資料來說明。 --- ### VI. 作業繳交 * 繳交期限:10/05-10/26 13:00 * 逾期繳交將按下規則**採連續扣分**。 * 逾期一日:得分扣10分。 * 逾期二日:再扣20分。 * 逾期三日:再扣30分。 * 逾期四日以上:得分以0分計算。 * 請將你的「程式原始碼」、「說明文件」打包成ZIP壓縮檔(請命名為`HW2_你的學號.zip`)。 * 說明文件 -> 請繳交Markdown(.md),或是PDF檔案。 * 若你使用HackMD寫文件,可以接受以匯出的HTML檔案繳交。 * 若你用其他形式撰寫文件,請轉換成PDF格式繳交。 * 不需要繳交測試所使用的輸入檔(input.csv)及輸出檔(output.json)。 * **請再次確認你的程式能夠正常執行,且說明文件中有包含指定的內容。** * 請將打包好的壓縮檔,上傳到Moodle的作業中,即可完成此次作業的繳交。 --- ### VII. 評分項目 > 作業會以下列原則評分,滿分為100分。 * **CSV to JSON轉換程式** * **是否滿足 III. 所規定之基本要求,若無法完全達成則本次作業以0分計算。** * 轉換結果和資料順序的正確性。 * 此程式的執行效率(速度)。 * **說明文件:效能分析報告的內容是本項評分的重點。** * 文件是否有包含指定的內容。 * 報告內容的完整度及正確性。 * 對系統資源觀察的程度以及呈現的說明內容。 * 使用不同執行緒數執行程式,對此程式觀察並比較。 --- ### VIII. 注意事項 * 你可以使用任意程式語言撰寫作業,但助教只會用Ubuntu環境執行你的程式,因此建議使用Linux OS來撰寫此份作業。 * 你可以用任何OS(Windows、Windows Subsystem for Linux、Virtual Machine等)開發,但如同前項所述,助教只會在Ubuntu中執行你的程式。 * 你可以在虛擬機器(Virtual Machine)上撰寫程式及分析效能,但請在報告中註記你是使用虛擬機器,並提供關於該虛擬機器的基本資訊(像是:OS、vCore、Memory size等)。 * **助教在評分時只會使用1GB大小的測試資料作為輸入資料(input.csv)。** * **嚴格禁止互相抄襲程式碼,助教會進行程式碼比對,違者此次作業以零分計算。** --- ### IX. 參考資料 * [Pthread](https://computing.llnl.gov/tutorials/pthreads/)