2011-01-12 4 views
3

사실적인 소셜 네트워크 (Facebook)를 모델로 시도하고 있습니다. 저는 컴퓨터 과학 대학원생으로서 기본적인 데이터 구조와 알고리즘을 이해하고 있습니다.수천만 명의 사용자가있는 현실적인 소셜 네트워크 모델. 어떤 기술을 사용해야합니까?

아이디어 :
나는이 프로젝트를 자바에서 시작했다. 내 아이디어는 여러 사용자 영역을 만드는 것입니다. 주어진 영역의 각 사용자는 주어진 평균을 중심으로 정규 분포를 갖는 임의의 수의 친구를 갖게됩니다. 각 사용자는 해당 지역의 "친구"가 속한 큰 비율 또는 클러스터를 갖게됩니다. 그들의 "친구"의 나머지 부분은 몇 가지 다른 무작위 영역에서 작은 클러스터 것입니다.

초기 구조
나는 "친구"
ArrayList<User> friends
의 ArrayList를 잡고 사용자 ArrayList<User> users

의 ArrayList를 각 사용자를 들고 각 지역으로 지역의 ArrayList를
ArrayList<Area> areas
을 만들고 싶었
거기에서 나는 각 지역 및 해당 지역의 각 사용자를 거쳐 그 지역의 친구들 대부분에게 w 몇 가지 무작위 영역에서 몇 친구로 ell. 내 데이터 세트가 작은 한 충분히 쉽습니다.

문제 : 나는 큰 데이터 세트를 만들려고 할 때
, 내가 인해 힙에서 더 이상 메모리에 OutOfMemoryError를 얻을. 이제는 지역 당 1 백만 명의 사용자가있는 30 개의 Area와 사용자 당 200 명의 친구를 만들고 싶다면이 일을하는 것이 불가능할 것입니다. 나는 1 Area와 거의 2 GB를 먹는다. .. 그래서 지금 무엇. 내가 미리 모든 사용자를 생성 한 다음 각 사용자에게 친구를 제공하면 알고리즘이 작동합니다. 하지만 먼저 영역과 사용자가 필요합니다. 지역에 사용자가 있어야 "친구"가 될 수 있습니다.

다음 단계 : 내 알고리즘을 좋아
, 그것은 간단하고 이해하기 쉽습니다. 필자가 필요로하는 것은이 데이터를 저장하는 더 좋은 방법입니다. 메모리에 저장하고 보관할 수 없기 때문입니다. 나는 각 사용자에 대해 사용자가 속한 영역뿐만 아니라 몇 가지 임의의 영역에도 액세스해야 할 필요가 있습니다.

내 질문 :
1.이 데이터를 넣어야하는 기술/데이터 구조. 결국 나는 기본적으로 사용자 -> 친구 관계가 필요합니다. "지역"아이디어는이 관계를 현실로 만드는 방법입니다.
2. 다른 언어를 모두 사용해야합니까? 나는 Lucene, Hadoop 등과 같은 기술이 Java로 만들어졌고 많은 양의 데이터에 사용된다는 것을 알고 있습니다 ... 그러나 새로운 것을 무언가를 배우기 전에 나는 그것을 사용한 적이 없으며 몇 가지 지침을 원합니다.
3. 어디서부터 시작해야합니까? 분명히 메모리의 데이터와 함께 java 만 사용할 수는 없습니다. 그러나 사용자에게 친구 목록을 제공하려면 이러한 사용자 영역을 만들어야합니다.

준결승 읽기에 대한 죄송하지만 정확한 위치로 나를 안내 할 수 있기를 바랍니다. 이 주제에 대해 읽거나 도움을 주신 모든 분들께 감사드립니다.

+0

에 여기서 뭐하는과에 같은 추가 좋은 정보를 많은 링크가 꽤 많이 있습니다 호환되지 않는.당신은 두 가지 옵션을 가지고 있습니다 : 여전히 "메모리에서"일하지만 자바 객체를 사용하지 않을 것입니다. (Trove는 여기서 도움이 될 것입니다. int에서 사용자 ID로 각 사용자를 표현할 수 있다면 Trove의 TIntArrayList **는 Java의 ArrayList를 깊게합니다. 자바 객체를 사용하지 않고 효율적인 프리미티브를 사용하기 때문에 엉덩이에서). 이 첫 번째 옵션은 "수천만"은 아니지만 "수백만 개"가 아닐 수도 있습니다. 두 번째 옵션 : DB를 사용하십시오. 선택의 여지가 많습니다. 그러나 POJOs, 당신은 실제로 그것에 대해 잊을 수 있습니다. – Gugussee

+0

64 비트 Java를 사용하고 메모리를 충분히 높게 설정 했습니까? 이것이 올바른 해결책이라고 말할 수는 없지만 모든 것을 메모리에 유지할 수 있습니다. –

+1

Gugussee 감사합니다. Trove의 TIntArrayList를 확실히 살펴 보겠습니다. 가능한 한 확장 성이 좋기 때문에 어떤 종류의 DB가 나를 위해 가장 잘 작동 할 것입니다. 64 비트 VM의 경우, 어느 정도까지는 작동 할 수 있지만 그 솔루션이 얼마나 확장 성이 있는지는 잘 모르겠습니다. – Eddie

답변

0
  1. 일부 ORM 도구를 사용하여 데이터베이스를 사용하여 [JPA 최대 절전 모드 등,
  2. 데이터로드 그들은 정말
  3. 것은 그들을 언로드 필요, 지연 때 그 캐시에서/세션이 실제로 필요하지 않거나 비활성 상태 일 때.

이해하기가 어려울 경우 알려 주시기 바랍니다.

http://puspendu.wordpress.com/

+0

JPA가 자바 라이브러리라고 추측합니다. 저는 신참 데이터베이스이며 기본 SQL 만 알고 있습니다. 당신은 이것을 위해 sql을 사용할 것이고, 어떤 향이 있습니까? 나는 또한 Hibernate가이 분야에서 꽤 유명하다는 것을 알았고, 내가 배워야 할 위대한 일이 될 것이다. 귀하의 의견을 보내 주셔서 감사합니다. – Eddie

+0

@Eddie MySQL 또는 Apache Derby를 데이터베이스 [Pesistent Storage]로 시작하는 것이 좋습니다. 오픈 소스이기 때문에 많은 기능이 포함되어 있습니다. JPA와 Hibernate는 객체 구조에 기반한 자체 쿼리 언어를 사용하여 많은 측면에서 개발자의 삶을 더 쉽게 만듭니다. –

0

는 관계를 표시하는 시각적 알고리즘의 모든 노드를 사용하여 계획하지 않는 한, 메모리에 모든 것을 유지 아마 아무 이익이 없습니다.

데이터베이스를 사용하는 경우 관계를 구축하고, 임의의 인구 통계 정보를 제공 할 수 있으며, 모델링을 원한다면 쿼리를 작성하는 것만 큼 문제가 될 수 있습니다.

그러나 많은 양의 데이터가 필요하다면 64 비트 Java를 사용하면 컴퓨터의 내용에 따라 훨씬 더 많은 메모리를 설정할 수 있습니다.

일단 관계를 구축하고 나면 여러 가지 방법으로 정보를 관련시키기 위해 쿼리를 작성할 수 있습니다.

크기가 다른 경우 배열 대신 목록을 사용하여 데이터를 읽을 때 메모리를 낭비하지 않아도됩니다. 나는 그것이 100 명이 넘는 사용자가 있다고 가정하고 이들 중 가장 많은 수의 친구가 50 명이라고 가정하지만 대부분이 10 명을 가질 것이라고 가정하면 그 사람이 대다수의 사용자에 대해 기억이 부족한 주된 이유가 될 것으로 기대합니다. 공간을 낭비합니다. 특히 수백만 개를 다루는 경우 각 객체의 포인터가 중요하지 않게됩니다.

데이터 구조를 다시 검사해야 할 수도 있습니다. 거기에 몇 가지 불이익이있을 것으로 예상됩니다.

당신은 또한 일부 모니터링 도구를 사용할 수 있으며,이 페이지가 도움이 될 수 있습니다 : 간단 http://www.scribd.com/doc/42817553/Java-Performance-Monitoring

심지어 뭔가를 JConsole을 사용하면 응용 프로그램과 함께 진행 상황을 확인하기 위해 도움이 될 것이다있다.

+0

네 말이 맞아, 나는 모든 노드가 필요 없을거야. 나는 친구 관계로 일할 것이지만 모든 것을 한꺼번에하는 것은 아닙니다. 내 문제는 사용자가 처음부터 존재하지 않고 이러한 관계를 만드는 것 같아요. – Eddie

2

데이터를 메모리에 보관하는 대신 검색 가능한 저장소 솔루션이 필요합니다. O/RM (예 : Hibernate) 또는 mongodb과 같은 nosql 데이터베이스가있는 관계형 데이터베이스 (예 : Oracle, MySQL 또는 SQL Server)는 정상적으로 작동합니다.

+0

이것은 사실입니다. 주요 목표는 검색 가능한 스토리지 솔루션을 보유하여 정보를 보관하는 것입니다. 내가 처음에는 정보를 만들지 않고이 구조에 삽입 할 정보를 만드는 방법을 모르겠다. 객체 관계형 매핑의 힘을 연구하는 것이 좋은 출발점이라고 할 수 있습니다. 나는이 물건들을 기억 속에 있지는 않지만 여러분이 언급 한 것과 같은 구조로 만들 것이라고 생각합니다. 그리고 거기에서 친구 관계를 만드십니까? 그리고 와우, 나는 너희들의 모든 반응에 감사한다 !! – Eddie

0

글쎄 당신은 여기에 새로운 장을 열지 못하고 있으며, 많은 양의 정보를 끌어 올 수 있고 필요에 맞게 재현 할 수있는 기존 모델이 많이 있습니다. 특히 당신이 사용하는 기술에 열려 있다면. 나는이 엄청난 숫자를 처음부터 채우려는 욕망을 이해하지만, 완전한 재 작성 없이는 견고한 기초가 구축되고 필요에 따라 변경 될 수 있음을 명심하십시오.

가 좋은 정보이고 "자바 객체를"무엇 FB, 링크드 인은, 디그, 다른 사람들이 * Stackoverflow question 1009025 * "수천만"

관련 문제