Почему MongoDB * client * использует больше памяти, чем сервер в этом случае? - PullRequest
0 голосов
/ 18 ноября 2011

Я оцениваю MongoDB. У меня есть небольшое подмножество документов размером 20 ГБ. Каждый из них, по сути, представляет собой журнал запросов на социальную игру вместе с некоторым захваченным состоянием игры, в которую пользователь играл в тот момент.

Я думал, что попробую найти читеров игры. Поэтому я написал функцию, которая работает на стороне сервера. Он вызывает find () для индексированной коллекции и сортирует в соответствии с существующим индексом. Используя курсор, он просматривает все документы в индексированном порядке. Индекс: {user_id, time}. Поэтому я просматриваю историю каждого пользователя, проверяя, увеличиваются ли определенные значения (деньги / здоровье / и т. Д.) Быстрее, чем это возможно в игре. Скрипт возвращает первое найденное нарушение. Не собирает нарушений.

ЕДИНСТВЕННАЯ вещь, которую этот скрипт выполняет на клиенте, это определение функции и вызовы mymongodb.eval(myscript) для экземпляра mongod в другом окне.

Коробка, на которой работает mongod, работает нормально. Тот, с которого запускается скрипт, начинает терять память и менять местами. Несколько часов спустя: 8 ГБ ОЗУ и 6 ГБ подкачки используются на клиентском компьютере, который не сделал ничего, кроме запуска сценария в другом окне и ожидания возвращаемого значения.

Является ли клиент Монго действительно таким ненормальным? Я сделал что-то не так или сделал неверное предположение о монго / монгод?

Ответы [ 2 ]

0 голосов
/ 18 ноября 2011

Из документации :

Используйте map / lower вместо db.eval () для длительных заданий.db.eval блокирует другие операции!

eval - это функция, которая блокирует весь сервер, если вы не используете специальный флаг.Опять же, из документов:

Если вы не используете флаг "nolock", db.eval () блокирует весь процесс mongod во время выполнения [...]

Вы злоупотребляете MongoDB здесь.Ваша текущая процедура выглядит странно, поскольку она возвращает первое найденное нарушение, но при следующем запуске она должна будет перепроверить все (если только не упорядочены ваши идентификаторы пользователя и вы не сохранили последний оцененный идентификатор пользователя).

Map / Reduce, как правило, является лучшим вариантом для длительной задачи, но объединение ваших данных не кажется тривиальным.Однако решение на основе карты / сокращения также решило бы проблему переоценки.

Я бы, вероятно, возвратил что-то подобное из карты / уменьшения:

user id -> suspicious actions, e.g.
------
2525454 -> [{logId: 235345435, t: ISODate("...")}]
0 голосов
/ 18 ноября 2011

Если вы просто хотите открыть клиентское соединение с удаленной базой данных, вы должны использовать команду mongo, а не mongod.mongod запускает сервер на вашем локальном компьютере.Не уверен, что будет делать указание URL.

Попробуйте

mongo remotehost:27017
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...