我的智商逐年遞增 第236章

作者:介安藝

  那笑容,溫暖如春。

  防盜門關上。

  屋子裡安靜了下來。

  陳建國一邊收拾茶几上的杯子,一邊感慨。

  “小拙啊,你對強子確實上心,老張家就這一個獨苗,你要真能把他成績拉起來,老張能把你當祖宗供起來。”

  “應該的,順手的事。”

  陳拙順手拿起自己的杯子喝了一口水,水順著喉嚨流下去,熨帖著胃部。

  想著張強未來二十天的悲慘生活,陳拙覺得今天這水喝起來都透著一股甘甜。

  他並不覺得愧疚,初二確實是分流的關鍵期,他總不能真的看著張強混成個只知道打街機的盲流吧。既然是兄弟,那就幫他把前路鋪好,哪怕這手段稍微痛苦了那麼一點點。

  就在這時,客廳角落裡的座機突然響了起來。

  “鈴鈴鈴”

  陳拙放下保溫杯,走過去拿起聽筒。

  “喂,你好。”

  聽筒那邊先是一陣極其嘈雜的背景音。

  有劈里啪啦狂敲機械鍵盤的聲音,有電腦機箱風扇的巨大轟鳴,甚至還夾雜著幾句尖銳的遊戲音效。“Fireinthehole!”

  “喂,拙哥!”

  聽筒裡傳來一個沙啞卻透著一股詭異興奮感的聲音。

  楚戈。

  “過年好啊。”

  陳拙把話筒換了隻手,走到窗戶邊。

  窗外,樓下又有人點燃了一掛鞭炮,劈里啪啦的響聲在積雪上炸開。

  “好個屁。”

  楚戈在那頭罵了一句,背景裡似乎還有人在喊老闆加泡麵。

  “我大年三十就在縣城這破網咖包宿,熬了整整兩天兩夜,鍵盤都快被我敲冒煙了。”

  楚戈的聲音裡帶著一種技術狂人特有的亢奮。

  “怎麼?你的底層架構寫崩了?”

  陳拙看著窗外炸開的鞭炮紙屑,語氣輕鬆。

  “架構沒崩,但資料庫卡死了。”

  楚戈在電話那頭猛吸了一口煙。

  “我跟京城那個搞六度空間的哥們,把初代校園社交網的模型搭起來了,但只要併發量一上來,幾千個使用者的多維交叉檢索,直接把他的租用伺服器搞成了死鎖。”

  楚戈頓了一下,語氣變得嚴肅起來。

  “拙哥,你期末在宿舍教我的那個離散代數矩陣降維,能不能改寫成資料庫的查詢語句?不用管連續性,只要能把多節點併發的冗餘砍掉一半就行。”

  陳拙的目光穿過結著冰花的玻璃,看向遠處灰藍色的天空。

  “能改。”

  陳拙看著窗外,聲音平穩。

  “找張紙條,拿筆,我念,你記。”

第166章 拉倒吧

  電話那頭的背景音亂成了一鍋粥。

  有人在扯著嗓子喊網管,C區三號機加十塊錢,還有人在拍桌子罵你丟雷啊,閃到我了,夾雜著一連串的咳嗽聲和打火機點菸的聲音。陳拙把座機的話筒稍微拿遠了一點。

  “你等會。”

  楚戈在那頭喊了一聲,緊接著是一陣拖拽椅子的摩擦聲,聲音稍微小了些,似乎是換了個角落。“行了,你說,我找著筆了。”

  楚戈咬著根糖,左手死死把話筒夾在肩膀和耳朵之間,右手在一堆亂七八糟的鍵盤線裡摸索出了一根圓珠筆。桌上沒有紙,他四下看了一眼,順手把旁邊吃剩的康師傅紅燒牛肉麵桶拉過來,把那層沾著幾滴紅油的硬紙蓋撕了下來,翻到背面。紙蓋背面有些潮溼,但不影響寫字。

  陳拙站在客廳的窗戶邊,看著玻璃上那層薄薄的霜花,伸手在上面劃了一道。

  “京城那邊的資料庫是怎麼建的?”陳拙問。

  “關係型,典型的樹狀結構。”

  楚戈使勁咬了兩口糖。

  “他們想做一個六度空間的社交網,底層邏輯很簡單,我是A,我認識B,資料庫就建一條邊,查詢我的好友,速度很快,查詢我好友的好友,也勉強能跑。”楚戈的聲音透著一股熬夜過後的乾澀感。

  “但是隻要往下查三度,四度,一旦併發量超過兩百人,資料庫就要做無限的巢狀聯合查詢,一張幾十萬使用者的表,瞬間交叉出幾千萬條冗餘資料。”“京城那哥們說,剛才他們做壓力測試,兩百個虛擬賬號同時點開可能認識的人這個功能,伺服器的風扇轉得像直升機,CPU直接飆到百分之百,三秒鐘後資料庫就鎖死了。”

  楚戈嘆了口氣。

  “現在這就成了一個死結,要想快,就得把所有關係提前算好存進快取,但這需要海量的記憶體,他們買不起那麼多伺服器,如果不提前算,實時查,只要稍微有幾個人同時訪問,資料庫就得崩。”

  陳拙聽完,沒有立刻說話。

  他走到沙發邊坐下,拿起果盤裡的一顆帶殼花生,在手裡輕輕捏開。

  “你們學計算機的,是不是有點軸?”

  陳拙把花生衣搓掉,語氣裡帶著一點笑意。

  “什麼意思?”

  楚戈愣了一下。

  “這是個純粹的圖論問題,你們為什麼要用查戶口的辦法去解?”

  陳拙把花生扔進嘴裡。

  “丟掉你們的巢狀查詢,把所有的使用者,看成高維空間裡的點,使用者之間的關係,是一條線。”楚戈沒吭聲,筆尖停在泡麵蓋子上。

  “建立一個鄰接矩陣。”

  陳拙的聲音很平穩,像是在大學自習室裡給人講一道大一的微積分課後題。

  “假設有十萬個使用者,就是一個十萬乘十萬的矩陣A,使用者i和使用者j是好友,矩陣中(i,j)的值就是1,否則就是0。”“等一下。”

  楚戈打斷了他。

  “十萬乘十萬,那是一百億個資料點,你算過這要佔多大記憶體嗎?伺服器當場就得炸。”

  “楚戈。”

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

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

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

  楚戈老老實實地回答。

  “正常人都沒有。”

  陳拙說。

  “所以,這個矩陣裡百分之九十九點九九的值,都是0,這是一個極度稀疏的稀疏矩陣。”楚戈拿著筆的手指猛地一緊。

  “在記憶體裡,你不需要存那一百億個點,你只需要存那些是1的座標就行了。”

  陳拙繼續往下說。

  “這就是個簡單的座標對映,接下來,你想找好友的好友,也就是二度人脈,在數學上怎麼表達?”楚戈的腦子轉得飛快,那些大一學過,後來又被他忘得差不多的線性代數知識,突然像閃電一樣劈開了他腦子裡的混沌。“矩陣乘法。”

  楚戈脫口而出。

  “A乘以A,A的平方。”

  “對。”

  陳拙站起身,走到茶几倒了杯溫水。

  “A的平方,矩陣裡值不為零的地方,就是二度人脈,A的立方,就是三度人脈。”

  楚戈看著泡麵蓋子,圓珠筆在上面無意識地畫著圈,呼吸變得急促起來。

  “但是矩陣相乘的計算量太大了,尤其是高階乘法,CPU還是吃不消。”

  楚戈提出了最核心的問題。

  “那是你太貪心了,你想一次性算出所有人的關係網路。”

  陳拙喝了口水,潤了潤嗓子。

  “伺服器不需要知道所有人認識誰,伺服器只需要回答當前登入的那個使用者的請求,所以,你不需要做矩陣和矩陣的乘法。”陳拙的聲音變得有些輕,但在楚戈耳朵裡卻像是一聲炸雷。

  “當前登入的使用者,不是一個矩陣,他是一個向量。”

  陳拙給出了最後的解法。

  “一個只有他自己那個位置是1,其餘全是0的向量,你拿這個一維向量,去乘那個稀疏矩陣,乘一次,得出他的直接好友向量,再拿結果去乘一次矩陣,得出二度好友。”

  陳拙頓了頓,補了一句。

  “向量乘稀疏矩陣,時間複雜度是0(N),就算他有一萬度的人脈,計算機做這種一維陣列的乘法,連一毫秒都用不了。”網咖裡,楚戈嘴裡的糖已經咬乾淨了。

  咬到了糖棍被駱了一下牙,他才猛地反應過來,一把將糖棍甩在地上。

  他的眼睛死死盯著面前那張沾著紅油的泡麵紙蓋。

  上面寫著兩行有些凌亂的公式。

  困擾了京城那個初創團隊整整半個月,被幾個清華計算機系的高材生視為無解硬體瓶頸的資料庫死鎖問題。在這個十二歲男孩嘴裡,被幾句最基礎的線性代數概念,直接降維打擊成了碎渣。

  “我懂了。”

  楚戈的聲音有些發抖。

  “拋棄資料庫的關係查詢,把所有的關係表抽出來,在記憶體裡維護一個稀疏矩陣,所有的查詢,全部在記憶體裡做向量相乘,算出結果後,再拿使用者ID去資料庫裡提頭像和名字。”

  “對。”

  陳拙應了一聲。

  “但是有個問題。”

  楚戈的程式設計師思維迅速抓住了漏洞。

  “A認識B,B認識C,C又認識A,這在圖論裡是個環,如果向量一直乘下去,會不會無限迴圈,把算力耗死?”“楚戈。”

  陳拙在電話那頭嘆了口氣,語氣裡帶著點無奈。

  “這是工程問題,不是數學證明題,向量乘出來的結果裡,凡是數值大於0的,你順手用個雜湊表把1D記下來,下次乘的時候遇到已經記過的,直接跳過不就行陳拙輕輕搖了搖頭。

  “你是個寫程式碼的,別指望數學公式連你拉屎用幾格紙都算清楚,用點你程式設計師的常識好嗎?”楚戈聽著電話裡那點調侃,突然咧開嘴樂了。

  “行,哥哥我承你這個情了,這回算我欠你的。”

  楚戈把那張泡麵蓋子折了兩下,小心翼翼地塞進貼身的口袋裡。

  “過完年回科大,我請你吃一個月的食堂小炒,先掛了,我得趕緊把這個底層的記憶體守護程序寫出來。”沒等陳拙說話,電話裡傳來了嘟嘟嘟的忙音。

  陳拙放下話筒,搖了搖頭,嘴角帶著一抹笑意。

  他轉過身,走向廚房去拿碗筷,準備吃晚飯。

  距離澤陽市一千多公里外的京城。

  中關村附近的一棟破舊居民樓裡。

  屋子裡沒開燈,只有三四顯示器散發著慘白的光,窗外偶爾閃過幾道絢爛的煙花,照亮了滿地的菸頭和吃剩的外賣盒。汪興裹著一件棉服,整個人窩在電腦椅裡,雙眼佈滿血絲,死死盯著螢幕上的後日志。

  他們想在這個網際網路的荒蠻時代,做一個真正意義上的實名制校園社交網站,點子是極好的,幾個汪興甚至已經靠著PPT拉到了一筆幾十萬的天使投資。但是技術瓶頸卡死了他們。

  明天就是大年初三,投資人要求看一個承載五百人同時線上的系統Demo。

  汪興已經三天沒閤眼了。

  只要併發量一上來,好友的好友這個核心功能的資料庫查詢,就會像雪崩一樣拖垮整個系統。螢幕右下角的MSN圖示突然跳動了起來。

  汪興佈滿血絲的眼睛動了一下,握著滑鼠點開。