Построение масштабируемого сервера - PullRequest
1 голос
/ 08 ноября 2010

Итак, я занимаюсь разработкой серверного приложения, которое должно хранить сотни тысяч (до нескольких миллионов в некоторых случаях) классов, сериализовать их в базу данных SQL и загружать их несколько раз, и кажется, чтоХранение такого количества объектов класса в List - это то, что вызывает исключение нехватки памяти?я думаю.

Так что возникает вопрос

  • как я могу избежать таких ошибок, все еще обрабатывая все мои около миллиона классов?
  • есть ли другие проблемычто может быть из-за наличия такого большого количества данных?
  • что еще я могу сделать, чтобы мой сервер был полностью масштабируемым и в конечном итоге мог обрабатывать и управлять как можно большим количеством данных?

Суть этого вопроса заключается в том, что мне нужно, чтобы все эти классы работали в памяти, так как мне нужно будет постоянно обновлять их таким образом, что это займет больше времени, чем я хотел бы сериализовать в базу данных SQL.Прямо сейчас, сейчас я использую меньше памяти, чем мне в конечном итоге понадобится даже!

Ответы [ 3 ]

3 голосов
/ 08 ноября 2010

Вы, вероятно, имеете в виду объекты, а не классы; -)

Архитектура масштабируемой обработки обычно включает в себя следующее:

В любой момент времени в памяти может быть только ограниченное количество объектов (может быть один, может быть десять, может быть сотня, но если это должно быть "сколько мне понадобится", то вы должны переосмыслить свой дизайн).Это гарантирует, что вы никогда не исчерпаете память, потому что максимальное использование памяти фиксировано.

Все объекты хранятся в базе данных.Когда вам нужен объект, которого нет в памяти, загрузите его из базы данных.Не храните его, если он не является частью ранее упомянутого краткого списка объектов.

Чтобы воспользоваться памятью, не используемой вашим коротким списком, вставьте слой кэширования между вашим кодом и базой данных, чтобы, если вы в конечном итоге извлекаете один и тот же объект много, затраты на это будут снижены.,Стратегия кэширования означает, что ваше программное обеспечение будет обменивать память на скорость только при наличии доступной памяти.

Попробуйте работать с небольшими транзакциями, которые читают некоторые вещи, записывают некоторые вещи обратно, затем начинают снова.Это помогает вашему программному обеспечению возобновить работу с того места, на котором оно было оставлено, в случае сбоя или сбоя во время его обработки.База данных должна быть достаточной, чтобы начать все заново с того места, где она ушла.

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

0 голосов
/ 08 ноября 2010

Может быть стоит кэшировать некоторые данные вашей базы данных, которые часто считываются в нечто вроде Memcached.http://en.wikipedia.org/wiki/Memcached

0 голосов
/ 08 ноября 2010

Во-первых, очевидное: убедитесь, что у вас достаточно оперативной памяти.Проанализируйте ваш код, чтобы узнать (приблизительно), сколько объектов у вас будет в памяти одновременно, а затем используйте профилировщик памяти.См. Следующий вопрос: Сколько памяти использует объект C # / .NET?

Во-вторых, если вам действительно нужны миллионы объектов, возможно, имеет смысл переосмыслить свой дизайн.Во многих случаях что-то простое, например большой многомерный массив , может быть более эффективным (и более предсказуемым с точки зрения памяти), чем сложное дерево классов .net.Применим ли этот совет к вашему делу или нет, я не могу сказать с данными под рукой.

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

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