Попробуйте что-то вроде этого:
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) {}
Удостоверьтесь, что Вы не сохраняете глобальные ссылки на данные. Это препятствует тому, чтобы сборщик "мусора" Python освободил память.
Не использовать mod_python
. Это загружает интерпретатор внутренний апач. Если необходимо использовать апача, использовать mod_wsgi
вместо этого. Это не хитро для переключения. Это очень легко. mod_wsgi
путь, легче настраивать для django, чем до полусмерти mod_python
.
Если бы можно удалить апача из требований, которые были бы еще лучше к памяти. spawning
кажется, новый быстрый масштабируемый способ запустить веб-приложения Python.
Править: Я не вижу, как переключение на mod_wsgi могло быть "хитрым". Это должна быть очень легкая задача. Уточните проблему, которую Вы имеете с переключателем.
Если Вы работаете под 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 переключились. Серьезно, это - легкая задача :)
Это решения профилировщика памяти Python, о которых я знаю (не связанный Django):
Отказ от ответственности: У меня есть доля в последнем.
Документация отдельного проекта должна дать Вам общее представление о том, как использовать эти инструменты для анализа поведения памяти приложений Python.
Следующее является хорошей "военной историей", которая также дает некоторые полезные подсказки:
Кроме того, проверьте, не используете ли Вы ни одного из известных приборов с натеканием. MySQLdb, как известно, пропускает огромные объемы памяти с Django из-за ошибки в обработке unicode. Кроме этого, Django Debug Toolbar мог бы помочь Вам отследить пожирателей ресурсов.
Webfaction на самом деле имеет некоторые подсказки для подавления django использование памяти.
Важные пункты:
В дополнение к не имению в наличии глобальных ссылок на большие объекты данных постарайтесь не загружать большие наборы данных в память вообще по мере возможности.
Переключитесь на mod_wsgi в режиме демона и используйте рабочего Apache mpm вместо предварительного ветвления. Этот последний шаг может позволить Вам служить значительно большему количеству параллельных пользователей с намного меньшей памятью наверху.
Кэши: удостоверьтесь, что они сбрасываются. Ее легкое для чего-то, чтобы приземлиться в кэше, но никогда не быть GC'd из-за ссылки кэша.
Код Swig'd: Удостоверьтесь, что любое управление памятью делается правильно, его действительно легкое для пропавших без вести их в Python, особенно со сторонними библиотеками
Контроль: Если Вы можете, получить данные об использовании памяти и хитах. Обычно Вы будете видеть корреляцию между определенным типом запроса и использованием памяти.
Другой плюс для mod_wsgi: набор a maximum-requests
параметр в Вашем WSGIDaemonProcess
директива и mod_wsgi перезапустят процесс демона время от времени. Не должно быть никакого видимого эффекта для пользователя кроме медленной загрузки страницы в первый раз, когда новый процесс поражен, поскольку он будет загружать Django и Ваш код приложения в память.
Но даже если у Вас действительно есть утечки памяти, которые должны помешать размеру процесса становиться слишком большим, не имея необходимость прерывать сервис для Ваших пользователей.
Вот сценарий, который я использую для 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, таким образом, Вы видите, имеет ли это значение.