作者:介安藝
“等一下。”
楚戈打斷了他。
“十萬乘十萬,那是一百億個數據點,你算過這要佔多大內存嗎?服務器當場就得炸。”
“楚戈。”
陳拙在電話這頭輕笑了一聲。
“你在現實裏,有十萬個朋友嗎?”
“沒有,我連十個都沒有。”
楚戈老老實實地回答。
“正常人都沒有。”
陳拙說。
“所以,這個矩陣裏百分之九十九點九九的值,都是0,這是一個極度稀疏的稀疏矩陣。”
楚戈拿着筆的手指猛地一緊。
“在內存裏,你不需要存那一百億個點,你只需要存那些是1的座標就行了。”
陳拙繼續往下說。
“這就是個簡單的座標映射,接下來,你想找好友的好友,也就是二度人脈,在數學上怎麼表達?”
楚戈的腦子轉得飛快,那些大一學過,後來又被他忘得差不多的線性代數知識,突然像閃電一樣劈開了他腦子裏的混沌。
“矩陣乘法。”
楚戈脫口而出。
“A乘以A,A的平方。”
“對。”
陳拙站起身,走到茶几倒了杯溫水。
“A的平方,矩陣裏值不爲零的地方,就是二度人脈,A的立方,就是三度人脈。”
楚戈看着泡麪蓋子,圓珠筆在上面無意識地畫着圈,呼吸變得急促起來。
“但是矩陣相乘的計算量太大了,尤其是高階乘法,CPU還是喫不消。”
楚戈提出了最核心的問題。
“那是你太貪心了,你想一次性算出所有人的關係網絡。”
陳拙喝了口水,潤了潤嗓子。
“服務器不需要知道所有人認識誰,服務器只需要回答當前登錄的那個用戶的請求,所以,你不需要做矩陣和矩陣的乘法。”
陳拙的聲音變得有些輕,但在楚戈耳朵裏卻像是一聲炸雷。
“當前登錄的用戶,不是一個矩陣,他是一個向量。”
陳拙給出了最後的解法。
“一個只有他自己那個位置是1,其餘全是0的向量,你拿這個一維向量,去乘那個稀疏矩陣,乘一次,得出他的直接好友向量,再拿結果去乘一次矩陣,得出二度好友。”
陳拙頓了頓,補了一句。
“向量乘稀疏矩陣,時間複雜度是O(N),就算他有一萬度的人脈,計算機做這種一維數組的乘法,連一毫秒都用不了。”
網吧裏,楚戈嘴裏的糖已經咬乾淨了。
咬到了糖棍被硌了一下牙,他才猛地反應過來,一把將糖棍甩在地上。
他的眼睛死死盯着面前那張沾着紅油的泡麪紙蓋。
上面寫着兩行有些凌亂的公式。
困擾了京城那個初創團隊整整半個月,被幾個清華計算機系的高材生視爲無解硬件瓶頸的數據庫死鎖問題。
在這個十二歲男孩嘴裏,被幾句最基礎的線性代數概念,直接降維打擊成了碎渣。
“我懂了。”
楚戈的聲音有些發抖。
“拋棄數據庫的關係查詢,把所有的關係表抽出來,在內存裏維護一個稀疏矩陣,所有的查詢,全部在內存裏做向量相乘,算出結果後,再拿用戶ID去數據庫裏提頭像和名字。”
“對。”
陳拙應了一聲。
“但是有個問題。”
楚戈的程序員思維迅速抓住了漏洞。
“A認識B,B認識C,C又認識A,這在圖論裏是個環,如果向量一直乘下去,會不會無限循環,把算力耗死?”
“楚戈。”
陳拙在電話那頭嘆了口氣,語氣裏帶着點無奈。
“這是工程問題,不是數學證明題,向量乘出來的結果裏,凡是數值大於0的,你順手用個哈希表把ID記下來,下次乘的時候遇到已經記過的,直接跳過不就行了。”
陳拙輕輕搖了搖頭。
“你是個寫代碼的,別指望數學公式連你拉屎用幾格紙都算清楚,用點你程序員的常識好嗎?”
楚戈聽着電話裏那點調侃,突然咧開嘴樂了。
“行,哥哥我承你這個情了,這回算我欠你的。”
楚戈把那張泡麪蓋子折了兩下,小心翼翼地塞進貼身的口袋裏。
“過完年回科大,我請你喫一個月的食堂小炒,先掛了,我得趕緊把這個底層的內存守護進程寫出來。”
沒等陳拙說話,電話裏傳來了嘟嘟嘟的忙音。
陳拙放下話筒,搖了搖頭,嘴角帶着一抹笑意。
他轉過身,走向廚房去拿碗筷,準備喫晚飯。
……
距離澤陽市一千多公里外的京城。
中關村附近的一棟破舊居民樓裏。
屋子裏沒開燈,只有三四臺顯示器散發着慘白的光,窗外偶爾閃過幾道絢爛的煙花,照亮了滿地的菸頭和喫剩的外賣盒。
汪興裹着一件棉服,整個人窩在電腦椅裏,雙眼佈滿血絲,死死盯着屏幕上的後臺日誌。
他們想在這個互聯網的荒蠻時代,做一個真正意義上的實名制校園社交網站,點子是極好的,幾個汪興甚至已經靠着PPT拉到了一筆幾十萬的天使投資。
但是技術瓶頸卡死了他們。
明天就是大年初三,投資人要求看一個承載五百人同時在線的系統Demo。
汪興已經三天沒閤眼了。
只要併發量一上來,好友的好友這個核心功能的數據庫查詢,就會像雪崩一樣拖垮整個系統。
屏幕右下角的MSN圖標突然跳動了起來。
汪興佈滿血絲的眼睛動了一下,握着鼠標點開。
是楚戈,那個遠在徽州,被他拉來當免費技術外援的科大變態黑客。
“老楚,別費勁了。”
汪興敲了一行字發過去,手指有些僵硬。
“我們試了加緩存,試了建索引,沒用,關係型數據庫處理不了這種多級網狀查詢,硬件扛不住。”
幾秒鐘後,楚戈發過來一個壓縮包。
只有不到20KB。
緊接着,楚戈的消息彈了出來。
“把你們之前的關係查詢代碼全刪了,把這個C語言寫的守護進程掛在服務器後臺。”
汪興愣了一下。
“這是什麼?”
“一個內存級別的稀疏矩陣相乘工具。”
楚戈的回覆很簡單。
“你只要把你們的關係表導出一份純文本塞給它,以後所有的好友查詢,不用過數據庫,直接發指令給這個進程,它在內存裏算完,把好友ID數組返回給你。”
汪興看着那段話,有些摸不着頭腦。
但他現在已經走投無路了,死馬當活馬醫。
他接收了文件,解壓,把源代碼拖進編譯器,粗略地掃了一眼。
這一看,汪興的冷汗嘩的一下就下來了。
代碼極其精簡,沒有任何數據庫連接的庫文件,全是底層的內存指針操作和幾個他看不太懂的一維數組循環相乘。
裏面沒有一條SQL語句。
汪興深吸了一口氣,把編譯好的執行文件掛到了測試服務器的後臺,然後把幾萬條測試用的關係數據塞了進去。
進程悄無聲息地啓動了,佔用內存不到五十兆。
“跑個壓測。”
汪興轉頭,對旁邊另一個已經困得東倒西歪的王惠文喊了一聲。
王惠文迷迷糊糊地揉了揉眼睛,在鍵盤上敲下了一行壓測指令。
“模擬五百個併發請求,三級好友深度查詢。”
王惠文敲完回車。
“興哥,準備重啓服務器吧,估計還是三秒鐘崩......”
話還沒說完,王惠文的聲音卡在了喉嚨裏。
壓測工具的進度條並沒有像之前那樣死死卡住,而是以一種肉眼幾乎無法捕捉的速度,瞬間刷滿。
滿屏的綠色。
汪興猛地坐直了身體,椅子發出不堪重負的嘎吱聲。
他死死盯着壓測結果的彙總數據。
請求完成數:500。
失敗數:0。
平均響應時間:3毫秒。
汪興覺得自己眼花了,他轉頭看了一眼服務器的系統資源監控。
在剛纔壓測的一瞬間,CPU的使用率僅僅跳動了一下,到了8%,然後又迅速回落到了1%。
服務器連風扇都沒來得及加速轉動,查詢就已經結束了。
屋子裏安靜得只能聽到機箱微弱的蜂鳴聲。
“興哥......”
旁邊的王惠文嚥了口唾沫,指着屏幕的手都在抖。
“這什麼情況?數據庫沒轉?”
“沒有過數據庫。”
汪興的聲音變得沙啞,他死死盯着剛纔那段C代碼,終於看明白了裏面那可怕的數學邏輯。
這不是在查數據。
這是在內存裏,直接對整個用戶關係網進行數學維度的降維計算。
汪興的手指有些發麻,他切回MSN的聊天窗口,手速極快地敲字,甚至連打了好幾個錯別字都顧不上改。
“老楚!這底層邏輯是誰寫的?!”
上一篇:华娱:牢景,你要剧本不要?!
下一篇:无敌镖人,开局护送灭世帝女!