• Хранение и выборка булевых значений. Mysql

    Dzuba
    @Dzuba
    Я бы попробовал следующее: хранить все 4 бита совместно в одном индексированном поле (назовем его bits), имеющем тип TINYINT UNSIGNED (либо BIT(4), либо SET).
    А запросы бы делал в виде:
    SELECT * FROM table WHERE bits IN (...)
    Где вместо многоточия должны быть перечислены те значения, которые удовлетворяют маске. Для маски, указанной вами в примере, запрос примет вид:
    SELECT * FROM table WHERE bits IN (b'1001', b'1011')
    На мой взгляд, при таком подходе и место экономится, и производительность будет наилучшей.
    Ответ написан
    5 комментариев
  • Примитивный модуль на C для Python течёт по памяти?

    @MikhailEdoshin
    Со списком все в порядке, проблема во взаимодействии функций. Py_BuildValue возвращает new reference, то есть объект со счетчиком ссылок, установленным в единицу, которым теперь владеет ваш код. Функция же PyList_Append не забирает у вас этот объект, а тоже увеличивает счетчик ссылок еще на единицу. Теперь у полученной строки будет два владельца — список и ваш код. Когда вы удалите список, он честно отнимет свою единичку от счетчика ссылок, но ваша-то там останется, поэтому Питон будет думать, что кто-то где-то эту строку еще использует.

    Вам нужно или явно уменьшить счетчик:

    PyObject *list, *item; /* static, право, ни к чему */
    list = PyList_New(0);
    item = Py_BuildValue("s"; "test");
    PyList_Append(list, item);
    Py_DECREF(item);
    return list;
    

    или же использовать функцию, которая не увеличивает счетчик (steals reference):

    PyObject *list;
    list = PyList_New(1); /* оставляем место для элемента */
    PyList_SET_ITEM(list, Py_BuildValue("s"; "test"));
    return list;
    

    (В данном случае я использовал макрос PyList_SET_ITEM, который как раз подходит для заполнения новых списков.)
    Ответ написан
    4 комментария