我試圖模擬一個現實的社交網絡(Facebook)。我是一名計算機科學研究生,所以我掌握了基本的數據結構和算法。10。我應該使用哪些技術?
想法:
我在java開始這個項目。我的想法是創建多個用戶區域。給定區域中的每個用戶將具有隨機數量的圍繞給定均值的正態分佈的朋友。每個用戶將擁有一個很大比例的或來自所屬區域的「朋友」羣集。他們的「朋友」的其餘部分將是來自幾個不同隨機區域的較小羣集。
初始結構
我想創造的領域持有用戶
ArrayList<User> users
的ArrayList並且每個用戶持有 「朋友」
ArrayList<User> friends
的ArrayList一個ArrayList
ArrayList<Area> areas
隨着每個片區
從那裏我可以通過每個區域,並在該地區的每個用戶,並給該用戶從該地區的大部分朋友,作爲瓦特作爲來自幾個隨機區域的幾個朋友。只要我的數據集很小,這很簡單。
問題:
當我嘗試創建大型數據集,我得到一個OutOfMemoryError由於堆沒有更多的內存。我現在意識到,如果我想創建30 Area的用戶,每個用戶有100萬用戶,並且每個用戶有200個好友,那麼這種做法是不可能的。我吃了幾乎2GB的1區...所以現在什麼。如果我可以提前創建所有用戶,那麼我的算法就可以工作,然後只需將「朋友」給予每個用戶即可。但我需要首先創建的區域和用戶。在可以成爲「朋友」之前,需要在區域中有用戶。
下一步:
我喜歡我的算法,它是簡單和容易理解。我需要的是更好的方式來存儲這些數據,因爲它不能一次存儲和保存在內存中。我不僅需要訪問用戶所屬的區域,還需要爲每個用戶提供一些隨機區域。
我的問題:
1.我應該把這些數據放到什麼技術/數據結構中。最後我基本上想要一個用戶 - >朋友關係。 「區域」的想法是使這種關係變得現實的一種方式。
2.我應該一起使用不同的語言。我知道諸如Lucene,Hadoop等技術是使用Java創建的,並且用於大量數據......但是我從未使用過它們,並希望在進入新內容之前獲得一些指導。
3.我應該從哪裏開始?顯然,我不能只用內存中的數據。但是我還需要創建這些用戶區域,然後才能向用戶提供朋友列表。
對不起,半長時間閱讀,但我想擺出我確切的位置,所以你可以引導我在正確的方向。感謝所有花時間閱讀/幫助我解決這個問題的人。
*「數千萬」 *和「Java對象」是幾乎不相容。你有兩個選擇:仍然在內存中工作,但不使用Java對象(Trove可能在這裏有所幫助,比方說,如果你可以用一個用戶ID來代表每個用戶,那麼Trove的TIntArrayList **將踢Java的ArrayList深度因爲它不使用Java對象而是有效的基元)。這第一個選項可能適用於「數千萬」,但可能不是「數億」。第二個選項:使用數據庫。那裏有很多選擇。但是POJO,你確實可以忘記它。 – Gugussee 2011-01-12 17:45:41
您是否看過使用64位Java並將內存設置得足夠高?不要說這是正確的解決方案,但這樣你可以將所有內容都保存在內存中。 – 2011-01-12 17:45:58
謝謝Gugussee,我一定會考慮Trove的TIntArrayList。因爲我想盡可能地擴展一些數據庫可能對我最好。至於64位虛擬機,雖然它可能工作到一定程度,但我不確定該解決方案具有多大的可擴展性。 – Eddie 2011-01-12 17:56:45