我的智商逐年遞增 第250章

作者:介安藝

  “等一下。”

  楚戈打斷了他。

  “十萬乘十萬,那是一百億個數據點,你算過這要佔多大內存嗎?服務器當場就得炸。”

  “楚戈。”

  陳拙在電話這頭輕笑了一聲。

  “你在現實裏,有十萬個朋友嗎?”

  “沒有,我連十個都沒有。”

  楚戈老老實實地回答。

  “正常人都沒有。”

  陳拙說。

  “所以,這個矩陣裏百分之九十九點九九的值,都是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的聊天窗口,手速極快地敲字,甚至連打了好幾個錯別字都顧不上改。

  “老楚!這底層邏輯是誰寫的?!”