Log for
#sitcon
<kevinlin45>: 不好意思, 想請問一下 Telegram 3.8.2.119501 AppStore For macOS 要如何中文化呢? 爬了網路上一些文章, 都無法中文化 QQ
<kevinlin45>: (@S_ean: 原生版本沒...) 悲傷....凱文來試試,謝謝
<benyii>: 除了 bloom filter 之外,還有沒有其他的方法,可以快速的知道資料在不在 而不用查資料庫的?
<mmis1000>: 定時把清單撈一份下來到local,沒在清單上的在連資料庫找?
<benyii>: (@mmis1000: 定時把清單...) 可是清單會一直長大,清單是文字檔嗎? 循序搜尋?! QQ
<mmis1000>: (@benyii: 可是清單會...) 學 haveibeenpwned ,用開頭分類阿 可能 /aabcc* 都在一個清單上那樣
<mmis1000>: 這樣遇到這個開頭的撈一次就好
<benyii>: 再講得更簡單一點,網址是基於 unix timestamp 產生的,例如 現在是 1525583967,轉成時間就是 2018-05-06 13:29:27,就會去抓例如 /20180506/13/19/27 之類的,所以這份清單是存 unix timestamp
<mmis1000>: 不過這前提是要撈的東西要有規律性
<mmis1000>: 不然一直 cache miss 也快不起來
<benyii>: timestamp 是以五分鐘為單位,所以 每個 timestamp 間隔會差 300
<seadog007>: (@benyii: 可是清單會...) 但是你的清單不會大到多少
<benyii>: (@mmis1000: 不能重複撈...) 不能,撈之前,檢查這個時間點撈過,就不會撈,不然資料會重覆 (資料來源是 csv 檔,一條一條)
<benyii>: (@seadog007: 但是你的清...) 怎說
<mmis1000>: 然後現在是要撈過去的東西,還是定時更新?
<seadog007>: 你一年才100000筆左右啊 (茶
<seadog007>: 你爬的網站一年內有沒有倒掉都還不知道
<mmis1000>: haveibeenpwned 也是塞了上億比才採到 bigQuery 的效能問題啊
<seadog007>: (@benyii: 不能,撈之...) 你爬蟲是一次跑很多隻嗎 不然為什麼會有重複撈的問題
<seadog007>: 不就SetInterval({}, 300000)
<Ti_wb>: (@Cakechen: 8d94有...) 還沒,但 Moz 有開
<mmis1000>: 如果真的要多隻爬蟲,不如弄個queue
<benyii>: 因為,資料是政府的,每五分鐘會出一筆,但有時候不會剛好五分鐘就出來,所以爬蟲的頻率是 1分鐘執行一次,抓最近的上個五分鐘,例如 13:24 會抓到 13:20 的資料
<mmis1000>: dirty check 聽起來真的不太理想
<seadog007>: (@benyii: 因為,資料...) 那你資料是直接丟資料庫裡面嗎?
<benyii>: (@seadog007: 那你資料是...) 是
<mmis1000>: (@benyii: 因為,資料...) 5分鐘的及時live...
<benyii>: (@seadog007: 那你資料是...) 而且還是 PostgreSQL
<seadog007>: ON Duplicate?
<mmis1000>: 沒有哪家db慢到一個查詢5分鐘才出來吧...
<seadog007>: (@mmis1000: 沒有哪家d...) 搞不好他活了N年(X
<mmis1000>: 把timestamp欄位index一下就好
<benyii>: (@seadog007: ON Du...) 讚,應該可以設定 compositive key 限制他只能有一筆?
<seadog007>: 塞進去的時候會噴error(茶
<mmis1000>: timestamp設個unique
<benyii>: (@mmis1000: 沒有哪家d...) 不是,政府的資料,假設 13:33 要出到 13:30,但他只有出到 13:20 或 13:15,有時快,有時慢,所以要每個五分鐘都去 retrieve
<mmis1000>: (@benyii: 不是,政府...) 沒差啊,你有5分鐘的時間看db裡到底有沒有那筆資料耶...
<seadog007>: (@seadog007: 塞進去的時...) 不過
<benyii>: 等等喔,我知道你們的想法XDD 我現在的設計是 一張表存抓取的記錄 (五分鐘一筆) 一張表存抓下來的資料 (五分鐘2600筆)
<mmis1000>: 而且你可以記錄最晚的那一筆阿
<benyii>: 所以 五分鐘 2600 筆那個,他的時間都會是一樣的,因為要記錄是屬於哪個 interval
<mmis1000>: 只要比較時間比那筆挽救賽就是了
<seadog007>: (@benyii: 等等喔,我...) 那你就去SELECT第一個資料表吧
<benyii>: 但抓取記錄是 unique timestamp 就是了
<seadog007>: 記得下index key
<benyii>: (@seadog007: 那你就去S...) 你是說 我就直接去 select exists 抓取記錄這張表,看這時間點有沒有抓過 這樣?
<benyii>: (@seadog007: 反正不會多...) 慢
<benyii>: 因為 app 跟 db 放在不同主機
<mmis1000>: 2600 / 300 也才每秒5筆
<benyii>: 等於 app 連外網的 server
<seadog007>: (@benyii: 因為 ap...) 額 那就是連線問題了吧(?
<mmis1000>: 而且可以 batch query
<seadog007>: 你connection不要關啊
<mmis1000>: 實際上也不需要真的送出 2600 個 query
<benyii>: (@seadog007: 額 那就是...) 對XDD 所以我不想要一直花時間在查詢,而且每一分鐘爬蟲動作的時候,就會查一次資料庫,感覺滿不經濟的 (( 會嗎?
<seadog007>: (@benyii: 對XDD ...) 還好啊 不然你可以local存一份抓過的清單
<benyii>: (@mmis1000: 實際上也不...) 我是用 insert 一次 bulk 插入
<mmis1000>: 然後你還剩下4分40秒可以慢慢搞
<benyii>: (@seadog007: 還好啊 不...) 那就回到我的 bloom filter 啦XDDD (redis 在 app 這端)
<mmis1000>: (@benyii: 我是用 i...) 你確定存不存在時也可以bulk查阿
<seadog007>: (@mmis1000: 你確定存不...) 幹嘛要bulk 不是才一筆嗎
<benyii>: 我現在就是 2600 筆抓下來的時候,就 bulk insert (一條 insert)
<mmis1000>: 是每個資料有各自的stamp不是嗎?
<mmis1000>: (@benyii: 我現在就是...) 這個
<seadog007>: (@mmis1000: 是每個資料...) 同一個
<benyii>: 慢是慢在 select 這時間點是否有直抓過 這個過程 (每一分鐘爬蟲動作的時候,就會 select 一次看這個時間點有沒有抓過)
<mmis1000>: 所以是有 2600 個資料來源 你會每隔 5 分鐘去看每一個來源有沒有更新 然後你在把新更新紀錄加進去db?
<seadog007>: @mmis1000 這樣
<benyii>: (@seadog007: Table...) 對對
<benyii>: (@mmis1000: 所以是有 ...) 同 @seadog007
<mmis1000>: 你的資料來源到底長怎樣啊?
<seadog007>: 我猜是一個json裡面有2600筆或是/timestamp/number number有2600個
<mmis1000>: 那個超芭樂的rar api
<mmis1000>: 還要打開才知道裡面的 id 是啥
<seadog007>: 所以他現在是 if `SELECT * FROM log WHERE timestamp=$now_fetching_one` return something then do nothing else insert fi
<benyii>: (@seadog007: 我猜是一個...) 不是,是像你這樣,每五分鐘會有 2600 筆資料,都同一個 timestamp
<seadog007>: (@benyii: 不是,是像...) 前者還後者啦www
<benyii>: 這個是 data,不是 log XDD
<mmis1000>: 所以你只是要看 16:30 存不存在?
<seadog007>: (@mmis1000: 所以你只是...) 對啦
<seadog007>: (@seadog007: 所以他現在...) 這樣
<benyii>: 我是要看,我的記錄裡面 16:30 有沒有抓過,沒抓過,就去把資料抓下來,抓下來的資料就會長得跟 這張圖一樣
<mmis1000>: 那樣一個存時間的table就好了啊,而且5分鐘才觸發一次,每次只撈一筆
<seadog007>: (@mmis1000: 那樣一個存...) 他不是有嗎www
<seadog007>: (@mmis1000: 到底有啥好...) 我也不知道啊ww
<seadog007>: @benyii 你連線不要關都沒問題啦
<benyii>: (@mmis1000: 那樣一個存...) 現在就有存時間的 table 啊,但爬蟲每一分鐘會動作一次,五分鐘是資料出來的頻率,但爬蟲是一分鐘一次
<mmis1000>: 先 fetch csl 下來 然後每一筆紀錄都去查 4:30 存不存在嗎?
<seadog007>: 我來個他現在情況的虛擬碼 ` newest = fetch_最新資料的timestamp() if 資料庫中 newest 抓過了{ 等一分鐘再來一次 }else{ fetch_資料 && insert }
<seadog007>: 這樣 @mmis1000 有沒有比較好懂
<benyii>: (@mmis1000: 所以是在糾...) 資料庫放在別台 server,每次抓都要查詢一次資料庫,資料庫那台又不是特別快,就會花時間在等連線 等回應,我想要減少查詢次數
<benyii>: (@seadog007: @beny...) 這應該是比較巨體的作法
<mmis1000>: 就是這樣才不好懂,這個寫法根本不可能踩到效能問題
<seadog007>: (@mmis1000: 就是這樣才...) (茶 沒關係你就假設那台慢爆好了
<seadog007>: (@benyii: 這應該是比...) 那你為什麼不要
<mmis1000>: (@benyii: 資料庫放在...) 那也才一分鐘一次
<benyii>: (@seadog007: 那你為什麼...) 因為你講了我才想到
<seadog007>: (@seadog007: 我來個他現...) 把這個改成 last = 0 newest = fetch_最新資料的timestamp() if newest == last { 等一分鐘再來一次 }else{ fetch_資料 && insert last = newest }
<mmis1000>: 人家算效能都是用 k/s 的
<seadog007>: (@seadog007: 把這個改成...) 這樣
<mmis1000>: day/s 等級的怎麼可能有事..
<seadog007>: (@mmis1000: 人家算效能...) 嗚嗚就有人資料庫很慢嘛(X
<seadog007>: (@seadog007: 把這個改成...) 然後做個local variable就好
<seadog007>: (@seadog007: 認真連線不...) 速度可能提昇個50%以上吧(茶
<mmis1000>: 講真的,如果只有一台,其實全部 local vaiable也沒差吧?
<seadog007>: (@mmis1000: 講真的,如...) 嘛 是啦 多台再去查db就好
<seadog007>: (@seadog007: 把這個改成...) 喔喔對 init的時候要先去拉一次
<benyii>: 我有想過 keep 一個最新的那一筆資料 timestamp 在 redis 裡面,這樣只要查 redis 就好
<seadog007>: (@benyii: 我有想過 ...) 那你根本不用timestamp吧
<mmis1000>: 你的redis好像完全沒有任何效耶 .-.
<benyii>: (@benyii: 我有想過 ...) 但我的情況沒這麼簡單,有時候他不會出來,我還要去補前面的資料
<seadog007>: (@benyii: 但我的情況...) 喔 那你就照你本來的方法去乖乖select他吧(?
<benyii>: (@seadog007: 喔 那你就...) \bloom filter/
<benyii>: index 是一定有設,真正「查詢」不會慢,慢的是「連線」
<seadog007>: 10000000 SELECT都不到1秒吧
<benyii>: 結論應該是你講的那樣,persist connect
<seadog007>: 你沒事開開關關幹嘛www
<benyii>: (@seadog007: 你沒事開開...) 因為 Laravel 會自己關 XDD
<seadog007>: 同一個連線就可以做完所有事啦(茶
<mmis1000>: 真的,放棄php是不是比較快
<mmis1000>: 為甚麼會有這麼妖孽的預設值
<seadog007>: (雖然我剛剛也在寫php
<mmis1000>: 倒底為啥要想不開去開開關關連線
<seadog007>: 但是我都把他當腳本語言寫 都不用任何框架的
<benyii>: (@mmis1000: 倒底為啥要...) 我幫你問一下 Tylor 老爸
<seadog007>: (@seadog007: 但是我都把...) 我就是不會OOP啊打我啊(X
<benyii>: (@seadog007: 我就是不會...) Java 表示: 讓你媽媽 new 一下
<mmis1000>: 是說你不是再寫爬蟲嗎?為啥會用到 Laravel .-.?
<tonyhhyip>: (@wayne1221: 【救命啊!...) 還以為有人
<toppy368>: 我還看了今天日期是否為四月份
<lien_lien>: (@wayne1221: 現在放棄 ...) 所以你的暑假來了嗎w