我正在尝试建立一个现实的社交网络(Facebook)。我是计算机科学研究生,所以我掌握了基本的数据结构和算法。
理念:
我在java中开始这个项目。我的想法是创建多个用户区域。给定区域中的每个用户将具有随机数量的朋友,其具有围绕给定均值的正态分布。每个用户将拥有来自他们所属区域的大量百分比或“朋友”群集。他们的“朋友”的其余部分将来自几个不同的随机区域。
初始结构
我想创建一个区域的ArrayList
ArrayList<Area> areas
每个区域都有一个用户的ArrayList
ArrayList<User> users
并且每个用户持有“朋友”的ArrayList
ArrayList<User> friends
从那里我可以浏览每个区域,以及该区域中的每个用户,并向该用户提供来自该区域的大多数朋友,以及来自几个随机区域的一些朋友。只要我的数据集很小,这就很容易了。
问题:
当我尝试创建大型数据集时,由于堆中没有更多内存,因此出现OutOfMemoryError。我现在意识到,如果我想创建30个区域,每个区域有1百万用户,每个用户有200个朋友,那么这样做是不可能的。我吃了差不多2gb的1区......所以现在是什么。如果我可以提前创建所有用户,那么我的算法将起作用,然后简单地“给”每个用户的朋友。但我需要先创建区域和用户。在成为“朋友”之前,区域内需要有用户。
下一步:
我喜欢我的算法,它简单易懂。我需要的是一种存储这些数据的更好方法,因为它不能一次性存储和保存在内存中。我不仅需要访问用户所属的区域,还需要为每个用户访问一些随机区域。
我的问题:
1.我应该将这些数据放入哪种技术/数据结构中。最后我基本上想要一个User-&gt; Friends关系。 “区域”理念是使这种关系变得现实的一种方式
2.我是否应该一起使用不同的语言。我知道Lucene,Hadoop等技术是用Java创建的,并且用于大量数据......但是我从未使用过它们,并且在我深入研究新的东西之前需要一些指导。
3.我应该从哪里开始?显然我不能只使用java与内存中的数据。但是,在向用户提供好友列表之前,我还需要创建这些用户区域。
对于半长时间的阅读感到抱歉,但我想准确地列出我的位置,这样你才能引导我朝着正确的方向前进。感谢所有花时间阅读/帮助我解决这个问题的人。
答案 0 :(得分:2)
您需要一个可搜索的存储解决方案来保存您的数据(而不是将其全部保存在内存中)。具有O / RM(例如Hibernate)的关系数据库(例如Oracle,MySQL或SQL Server)或诸如mongodb的nosql数据库都可以正常工作。
答案 1 :(得分:0)
如果有任何难以理解的话,请告诉我。感觉很舒服。
答案 2 :(得分:0)
除非您计划使用某些可视算法中的每个节点来显示关系,否则在内存中保留所有内容可能没有任何好处。
因此,如果您使用数据库,那么您可以建立您的关系,提供随机的人口统计信息,如果您还要对其进行建模,那么只需编写您的查询。
但是,如果您确实需要大量数据然后使用64位Java,那么您可以将内存设置为更大的数字,具体取决于计算机上的内容。
因此,一旦建立了关系,就可以开始编写查询,以不同的方式关联信息。
当大小不同时,您可能希望使用Lists而不是Arrays,以便在读取数据时不会浪费内存。我希望这是你内存不足的主要原因,如果你假设有100个用户,其中任何一个的朋友数量最多就是50个,但大多数会有10个,那么对于绝大多数用户来说,你是浪费空间,特别是当你处理数百万时,因为每个对象的指针都变得非常重要。
您可能希望重新检查数据结构,我希望您在那里遇到一些不足之处。
您可能还想使用一些监控工具,此页面可能有所帮助: http://www.scribd.com/doc/42817553/Java-Performance-Monitoring
即使像jconsole这样简单的东西也可以帮助您查看应用程序的运行情况。
答案 3 :(得分:0)
嗯,你并没有在这里开辟新的领域,而且有许多现有的模型可以从中提取大量信息并根据您的需求量身定制。特别是如果您对所使用的技术持开放态度。我理解你希望从一开始就填充这个庞大的数字,但请记住,可以建立一个坚实的基础,并根据需要进行更改,而无需完全重写。
有一些很好的信息以及很多关于FB,LinkedIn,Digg和其他人在Stackoverflow question 1009025
所做的事情的更多信息的链接