Уменьшение использования памяти Django. Низко висящий фрукт?

Попробуйте что-то вроде этого:

tabu.erase(
    std::remove_if(tabu.begin(), tabu.end(), [valueToErase](const tabuRecord & t) {
    return (t.x==valueToErase.x) && (t.y == valueToErase.y) && (t.k == valueToErase.k);
}), tabu.end());

При этом используется лямбда , которая возвращает true, если три поля равны, и удаляет все значения, если это так.

Вот полный пример:

#include 
#include 
#include 

int main(int argc, char **argv)
{
    tabuRecord valueToErase(1, 2, 3); // example value to remove

    tabu.push_back({ 1, 2, 3 });
    tabu.push_back({ 4, 5, 6 });
    tabu.push_back({ 1, 2, 3 });
    tabu.push_back({ 7, 8, 9 });

    tabu.erase(
        std::remove_if(tabu.begin(), tabu.end(), [valueToErase](const tabuRecord & t) {
        return (t.x==valueToErase.x) && (t.y == valueToErase.y) && (t.k == 
        valueToErase.k);
    }), tabu.end());

    for (tabuRecord t : tabu) {
        std::cout << "x: " << t.x << " y: " << t.y << " k: " << t.k << std::endl;
    } // print all entries to verify that the correct ones were removed

    return 0;
}

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

: x(x), y(y), k(k) {}

135
задан Community 23 May 2017 в 10:29
поделиться

9 ответов

Удостоверьтесь, что Вы не сохраняете глобальные ссылки на данные. Это препятствует тому, чтобы сборщик "мусора" Python освободил память.

Не использовать mod_python. Это загружает интерпретатор внутренний апач. Если необходимо использовать апача, использовать mod_wsgi вместо этого. Это не хитро для переключения. Это очень легко. mod_wsgi путь, легче настраивать для django, чем до полусмерти mod_python.

Если бы можно удалить апача из требований, которые были бы еще лучше к памяти. spawning кажется, новый быстрый масштабируемый способ запустить веб-приложения Python.

Править: Я не вижу, как переключение на mod_wsgi могло быть "хитрым". Это должна быть очень легкая задача. Уточните проблему, которую Вы имеете с переключателем.

49
ответ дан 23 November 2019 в 23:48
поделиться

Если Вы работаете под mod_wsgi и по-видимому мечете икру, так как это WSGI совместимый, можно использовать Dozer для рассмотрения использования памяти.

Под mod_wsgi просто добавляют это в нижней части Вашего сценария WSGI:

from dozer import Dozer
application = Dozer(application)

Затем укажите на свой браузер на http://domain/_dozer/index для наблюдения списка всех выделений памяти.

Я также просто добавлю свою речь поддержки mod_wsgi. Это делает мир различия в терминах производительности и использования памяти по mod_python. Поддержка Graham Dumpleton mod_wsgi является выдающейся, и с точки зрения активной разработки и в помощи людям в списке рассылки оптимизировать их установки. David Cramer по curse.com отправил некоторые диаграммы (который я, может казаться, не нахожу теперь, к сожалению), показ решительного сокращения CPU и использования памяти после того, как они переключились на mod_wsgi на том сайте интенсивного трафика. Несколько из django devs переключились. Серьезно, это - легкая задача :)

28
ответ дан 23 November 2019 в 23:48
поделиться

Это решения профилировщика памяти Python, о которых я знаю (не связанный Django):

Отказ от ответственности: У меня есть доля в последнем.

Документация отдельного проекта должна дать Вам общее представление о том, как использовать эти инструменты для анализа поведения памяти приложений Python.

Следующее является хорошей "военной историей", которая также дает некоторые полезные подсказки:

14
ответ дан 23 November 2019 в 23:48
поделиться

Кроме того, проверьте, не используете ли Вы ни одного из известных приборов с натеканием. MySQLdb, как известно, пропускает огромные объемы памяти с Django из-за ошибки в обработке unicode. Кроме этого, Django Debug Toolbar мог бы помочь Вам отследить пожирателей ресурсов.

5
ответ дан 23 November 2019 в 23:48
поделиться

Webfaction на самом деле имеет некоторые подсказки для подавления django использование памяти.

Важные пункты:

  • Удостоверьтесь, что отладка имеет значение false (Вы уже знаете это).
  • Используйте "ServerLimit" в своей апачской конфигурации
  • Проверьте, что никакие большие объекты не загружаются в памяти
  • Рассмотрите служащее статическое содержание в отдельном процессе или сервере.
  • Используйте "MaxRequestsPerChild" в своей апачской конфигурации
  • Узнайте и поймите, сколько памяти Вы используете
4
ответ дан 23 November 2019 в 23:48
поделиться

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

Переключитесь на mod_wsgi в режиме демона и используйте рабочего Apache mpm вместо предварительного ветвления. Этот последний шаг может позволить Вам служить значительно большему количеству параллельных пользователей с намного меньшей памятью наверху.

4
ответ дан 23 November 2019 в 23:48
поделиться

Кэши: удостоверьтесь, что они сбрасываются. Ее легкое для чего-то, чтобы приземлиться в кэше, но никогда не быть GC'd из-за ссылки кэша.

Код Swig'd: Удостоверьтесь, что любое управление памятью делается правильно, его действительно легкое для пропавших без вести их в Python, особенно со сторонними библиотеками

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

1
ответ дан 23 November 2019 в 23:48
поделиться

Другой плюс для mod_wsgi: набор a maximum-requests параметр в Вашем WSGIDaemonProcess директива и mod_wsgi перезапустят процесс демона время от времени. Не должно быть никакого видимого эффекта для пользователя кроме медленной загрузки страницы в первый раз, когда новый процесс поражен, поскольку он будет загружать Django и Ваш код приложения в память.

Но даже если у Вас действительно есть утечки памяти, которые должны помешать размеру процесса становиться слишком большим, не имея необходимость прерывать сервис для Ваших пользователей.

3
ответ дан 23 November 2019 в 23:48
поделиться

Вот сценарий, который я использую для mod_wsgi (названный wsgi.py и вставляю корень от своего django проекта):

import os
import sys
import django.core.handlers.wsgi

from os import path

sys.stdout = open('/dev/null', 'a+')
sys.stderr = open('/dev/null', 'a+')

sys.path.append(path.join(path.dirname(__file__), '..'))

os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings'
application = django.core.handlers.wsgi.WSGIHandler()

Скорректируйте myproject.settings и путь по мере необходимости. Я перенаправляю весь вывод к/dev/null, так как mod_wsgi по умолчанию предотвращает печать. Используйте вход вместо этого.

Для апача:

<VirtualHost *>
   ServerName myhost.com

   ErrorLog /var/log/apache2/error-myhost.log
   CustomLog /var/log/apache2/access-myhost.log common

   DocumentRoot "/var/www"

   WSGIScriptAlias / /path/to/my/wsgi.py

</VirtualHost>

Надо надеяться, это должно, по крайней мере, помочь Вам настроить mod_wsgi, таким образом, Вы видите, имеет ли это значение.

3
ответ дан 23 November 2019 в 23:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: