2011-01-12 119 views
3

我試圖模擬一個現實的社交網絡(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.我應該從哪裏開始?顯然,我不能只用內存中的數據。但是我還需要創建這些用戶區域,然後才能向用戶提供朋友列表。

對不起,半長時間閱讀,但我想擺出我確切的位置,所以你可以引導我在正確的方向。感謝所有花時間閱讀/幫助我解決這個問題的人。

+0

*「數千萬」 *和「Java對象」是幾乎不相容。你有兩個選擇:仍然在內存中工作,但不使用Java對象(Trove可能在這裏有所幫助,比方說,如果你可以用一個用戶ID來代表每個用戶,那麼Trove的TIntArrayList **將踢Java的ArrayList深度因爲它不使用Java對象而是有效的基元)。這第一個選項可能適用於「數千萬」,但可能不是「數億」。第二個選項:使用數據庫。那裏有很多選擇。但是POJO,你確實可以忘記它。 – Gugussee 2011-01-12 17:45:41

+0

您是否看過使用64位Java並將內存設置得足夠高?不要說這是正確的解決方案,但這樣你可以將所有內容都保存在內存中。 – 2011-01-12 17:45:58

+1

謝謝Gugussee,我一定會考慮Trove的TIntArrayList。因爲我想盡可能地擴展一些數據庫可能對我最好。至於64位虛擬機,雖然它可能工作到一定程度,但我不確定該解決方案具有多大的可擴展性。 – Eddie 2011-01-12 17:56:45

回答

0
  1. 使用一些ORM工具數據庫[JPA休眠等],
  2. 加載數據懶洋洋,當真正需要它們
  3. 卸載它們的時候它們緩存 /會話時,他們不是真正需要或不活動。

如果有任何困難需要了解,請隨時告訴我。

http://puspendu.wordpress.com/

+0

我猜JPA是一個java庫。我是一個數據庫新手,只知道基本的SQL。你會用這個sql,以及哪種風格?我也注意到Hibernate在這個領域非常流行,對我來說這將是一件很棒的事情。謝謝您的意見。 – Eddie 2011-01-12 18:09:03

0

有可能是沒有好處保持它都在內存中,除非你正在使用的每個節點在一些視覺算法來顯示關係計劃。

因此,如果您使用數據庫,那麼您可以建立您的關係,給出隨機的人口統計信息,如果您想對其進行建模,那麼這只是編寫查詢的問題。

但是,如果您確實需要大量數據,那麼通過使用64位Java,則可以將內存設置爲更大的數量,具體取決於計算機上的內容。

因此,一旦建立了關係,就可以開始編寫查詢,以不同的方式關聯信息。

當尺寸不同時,您可能希望查看使用列表而非數組,以便您在讀取數據時不浪費內存。我認爲這是你內存不足的主要原因,如果你認爲有100個用戶,並且其中任何一個的最大朋友數量是50,但是大多數將有10個,那麼對於絕大多數用戶浪費空間,特別是當你處理數百萬時,因爲每個對象的指針將變得不平凡。

你可能想重新檢查你的數據結構,我希望你有一些不足之處。

您可能還需要使用一些監控工具,而這個頁面可以幫助: http://www.scribd.com/doc/42817553/Java-Performance-Monitoring

即使是一些簡單的JConsole的會幫助你看到正在發生的事情與你的應用程序。

2

您需要一個可搜索的存儲解決方案來保存您的數據(而不是將它全部放在內存中)。關係數據庫(如Oracle,MySQL或SQL Server)與O/RM(如Hibernate)或nosql數據庫(如mongodb)都可以正常工作。

0

那麼你在這裏沒有開創新的領域,現在有很多現有的模型,你可以從中抽取大量的信息,並根據你的需求定製。特別是如果你對所使用的技術開放。我理解你希望從一開始就填補這個龐大的數字,但要牢記一個堅實的基礎可以根據需要進行構建和更改,而不需要完全重寫。

有一些好的信息和許多鏈接到更多的好消息,什麼FB,LinkedIn,Digg和其他地方的做法在這裏Stackoverflow question 1009025

相關問題