使用任何東西之前,即使自以為熟悉,也要掃描過說明書。如果不恰當的使用這個東西會造成不幸,那就要詳讀說明書。
看了上面的話會不會覺得接著要說的事情很嚴肅?其實這句話是這樣來的,請聽我娓娓道來..
因為有可能會在沒有網路的情況下寫 haskell 程式,很擔心寫到一半發現漏掉了某個程式庫,就只能輕扯頭髮,責罵自己的糊塗...。但我沒有預測未來的能力,很難判斷自己會不會突然需要哪個程式庫..那,如果可以擁有整個 hackage 的話呢(也就是做一個 hackage 的私人 mirror)?
在這樣的構想下,對 hackage 進行探索,發現藉由取得 00-index.tar.gz 即可得到所有 hackage package 存放的位置等珍貴資訊。我可以依據這樣的資料下載整個 hackage 到自己的電腦裡。
對這個程式有興趣的見這裡。這個程式的流程大概是:使用 http-conduit 的 simpleHttp 下載索引檔,剖析它的目錄結構,接著規劃下載(當然也利用 http-conduit 的 simpleHttp),然後全部下載完後做解壓縮測試看有沒有下載錯誤。這樣就結束了是也~為什麼用 http-conduit 的 simpleHttp?它就寫在 http-conduit 說明文件最上端的範例裡,就用下去了。
自己測試的結果是覺得有點慢。整個 hackage 不到 4 GB(下載後統計),但有三萬多個檔案,好吧,接受它,反正放個隔夜應該就沒問題了...就這樣這個程式被我放了一小段時間,反正也沒有大蟲,大概安定了吧(自己用都沒問題的)。
直到有天翻了 http-conduit 的說明書,看到下面的這段話:
Note: Even though this function returns a lazy bytestring, it does not utilize lazy I/O, and therefore the entire response body will live in memory. If you want constant memory usage, you'll need to use the conduit package and http directly. Note: This function creates a new Manager. It should be avoided in production code.第一個 note 寫的東西代表,下載的 package 有多大,就會佔據多少的記憶體空間。感覺很危險但其實由於單一 package 大概不會大到 10M ~ 100M ,所以 OK。但第二點就有點棘手了。所謂的 manager 似乎是連接管理的系統,而且後面那句「不該用在產品中」..代表這是「玩具函數」(toy function,讓你體驗一下本程式庫的能力),可能有效能或其他的問題(前一句的「本函數會創造新的 manager,代表每呼叫一次就會產生一個新的 manager..」)..
看到這段話後,我馬上把 simpleHttp 重新實作。藉著把 http-conduit 的 simpleHttp 藏起來,然後自己實作一個可以使用 Manager 的版本,把這個問題解決掉了。
效果到底如何其實不是那麼重要。軟體文件指出不該把 simpleHttp 使用在產品中已經是一個做修改的強力理由。只是..我還是想知道這樣的修改會不會實際上影響效能,所以我讓它們(改前,改後)下載 200 個 package 然後比較所消耗的時間。結果大致上如下:
6:d5f93b3f4f0f:(修改前) [196/32114] Downloading AspectAG 0.1.1 (/tmp/d5f93b3f4f0f/hackage/AspectAG/0.1.1/AspectAG-0.1.1.tar.gz) [197/32114] Downloading AspectAG 0.1.2 (/tmp/d5f93b3f4f0f/hackage/AspectAG/0.1.2/AspectAG-0.1.2.tar.gz) [198/32114] Downloading AspectAG 0.1.3 (/tmp/d5f93b3f4f0f/hackage/AspectAG/0.1.3/AspectAG-0.1.3.tar.gz) [199/32114] Downloading AspectAG 0.1.4 (/tmp/d5f93b3f4f0f/hackage/AspectAG/0.1.4/AspectAG-0.1.4.tar.gz) [200/32114] Downloading AspectAG 0.1.5 (/tmp/d5f93b3f4f0f/hackage/AspectAG/0.1.5/AspectAG-0.1.5.tar.gz) ^Cuser interrupt, retry ^C real 4m39.019s user 0m1.581s sys 0m0.322s 9:ec2e7e40f502 (新版) [196/32114] Downloading AspectAG 0.1.1 (/tmp/now/hackage/AspectAG/0.1.1/AspectAG-0.1.1.tar.gz) [197/32114] Downloading AspectAG 0.1.2 (/tmp/now/hackage/AspectAG/0.1.2/AspectAG-0.1.2.tar.gz) [198/32114] Downloading AspectAG 0.1.3 (/tmp/now/hackage/AspectAG/0.1.3/AspectAG-0.1.3.tar.gz) [199/32114] Downloading AspectAG 0.1.4 (/tmp/now/hackage/AspectAG/0.1.4/AspectAG-0.1.4.tar.gz) [200/32114] Downloading AspectAG 0.1.5 (/tmp/now/hackage/AspectAG/0.1.5/AspectAG-0.1.5.tar.gz) [201/32114] Downloading AspectAG 0.1.6 (/tmp/now/hackage/AspectAG/0.1.6/AspectAG-0.1.6.tar.gz) ^Cuser interrupt, retry ^C real 1m53.922s user 0m1.232s sys 0m0.644s漏看說明書的代價是要等更久的時間來複製整個 hackage 。
沒有留言:
張貼留言