Я пытаюсь смоделировать реалистичную социальную сеть (Facebook).Я аспирант по компьютерным наукам, поэтому я разбираюсь в базовых структурах данных и алгоритмах.
Идея:
Я начал этот проект в Java.Моя идея заключается в создании нескольких областей пользователей.Каждый пользователь в данной области будет иметь случайное количество друзей с нормальным распределением вокруг заданного среднего значения.Каждый пользователь будет иметь большой процент или группу «Друзей» из Района, к которому он принадлежит.Остальные их «Друзья» будут небольшими кластерами из нескольких разных случайных областей.
Исходная структура
Я хотел создать ArrayList областей
ArrayList<Area> areas
С каждой областью, содержащей ArrayList пользователей
ArrayList<User> users
И с каждым пользователем, имеющим ArrayList «друзей»
ArrayList<User> friends
Оттуда я могу пройти через каждую область,и каждого пользователя в этом Районе и предоставьте этому пользователю большинство своих друзей из этого Района, а также нескольких друзей из нескольких случайных Районов.Это достаточно просто, пока мой набор данных остается маленьким.
Проблема:
Когда я пытаюсь создать большие наборы данных, я получаю OutOfMemoryError из-за нехватки памяти вкучаТеперь я понимаю, что этот способ будет невозможен, если я захочу создать, скажем, 30 областей с 1 миллионом пользователей на область и 200 друзьями на пользователя.Я ем почти 2 ГБ с 1 областью ... Ну и что теперь.Мой алгоритм сработал бы, если бы я мог создать всех пользователей заранее, а затем просто «дать» друзей каждому пользователю.Но мне нужно сначала создать Области и пользователей.Чтобы стать «другом», в Районе должен быть пользователь.
Следующий шаг:
Мне нравится мой алгоритм, он прост и понятен.Что мне нужно, так это лучший способ хранения этих данных, поскольку они не могут быть сохранены и сохранены в памяти одновременно.Мне понадобится не только доступ к Области, к которой принадлежит пользователь, но и несколько случайных областей для каждого пользователя.
Мои вопросы:
1. Чтотехнология / структура данных, я должен помещать эти данные в.В конце концов, я в основном хочу отношения между пользователем и друзьями.Идея «Площадь» - это способ сделать эти отношения реалистичными.
2. Должен ли я использовать другой язык все вместе.Я знаю, что такие технологии, как Lucene, Hadoop и т. Д. Были созданы с использованием Java и используются для больших объемов данных ... Но я никогда не использовал их и хотел бы получить некоторые рекомендации, прежде чем погрузиться в что-то новое.
3. С чего мне начать?Очевидно, я не могу использовать только Java с данными в памяти.Но мне также нужно создать эти Области пользователей, прежде чем я смогу предоставить Пользователю список друзей.
Извините за полудлинное чтение, но я хотел выложить именно то, где я, чтобы вы могли направлять меняв правильном направлении.Спасибо всем, кто нашел время, чтобы прочитать / помочь мне с этой темой.