Когда объекты мусора собраны в python?
В исходном коде для CPython много деталей: http://svn.python.org/view/python/trunk/ Модули / gcmodule.c? Revision = 81029 & amp; view = markup
Каждый раз, когда счетчик ссылок падает до нуля, объект немедленно удаляется.
293 / * Циклический gc Python никогда не должен видеть входящий refcount
294 * of 0: если что-то уменьшилось до 0, оно должно было быть
295 * немедленно освобождено в это время.
blockquote>Полная коллекция запускается, когда число новых объектов превышает 25% от числа существующих объектов.
87 В дополнение к различным настраиваемым пороговым значениям мы запускаем только полную коллекцию
88, если отношение
89 long_lived_pending / long_lived_total
90 находится выше заданного значения (с привязкой к 25%).
blockquote>Когда освобождена память?
Я смог вытащить эту информацию .
781 / * Очистить все свободные списки
782 * Все бесплатные списки удаляются во время сбора самого высокого поколения.
783 * Выделено элементы в свободном списке могут содержать занимаемую арену pymalloc.
784 * Удаление бесплатных списков может вернуть память ранее.
785 * /
blockquote>В соответствии с этим Python может хранить ваш объект в свободном списке для повторной переработки, даже если вы отбросите его refcount на ноль. Я не могу явно найти, когда бесплатный вызов выполняется, чтобы вернуть память в операционную систему, но я полагаю, что это делается всякий раз, когда создается коллекция, и объект не хранится в свободном списке.
Эффект влияет на производительность?
Любой нетривиальный сборщик мусора, о котором я слышал, требует как процессора, так и памяти. Поэтому да, всегда есть влияние на производительность. Вам нужно будет поэкспериментировать и познакомиться с вашим сборщиком мусора.
Программы, требующие оперативной реакции в реальном времени. Я столкнулся с проблемами, поскольку сборщики мусора не дают мне контроля над тем, когда они запускаются или для чего они долго. Некоторые специфические случаи могут вызвать чрезмерное использование памяти, примером может быть умение Python для хранения свободных списков.
Просто получите все 1000 NEXTVAL
в одном запросе, это должно быть быстро.
CREATE SEQUENCE vaibhav_seq;
WITH t(n) AS (
SELECT 1 FROM DUAL
UNION ALL
SELECT n + 1 FROM t
WHERE n < 1000)
SELECT vaibhav_seq.NEXTVAL FROM t;
Затем вы можете использовать их со своими INSERT
утверждениями.
Если вас интересует только отправка в базу данных, вам не нужно для извлечения последовательности nextval
. Просто используйте его в своем INSERT
утверждении:
CREATE TABLE vaibhav (
id NUMBER PRIMARY KEY,
data VARCHAR(100)
);
CREATE SEQUENCE vaibhav_seq;
INSERT INTO vaibhav(id, data)
VALUES (vaibhav_seq.nextval, 'foo');
INSERT INTO vaibhav(id, data)
VALUES (vaibhav_seq.nextval, 'bar');
SELECT id, data FROM vaibhav;
ID DATA
---- ----------
1 foo
2 bar
Ну, я не думаю, что вы можете отключить его. Что вы можете сделать, это создать триггер базы данных, который позаботится о вставке его значения. Вот пример:
SQL> create table test (id number, col varchar2(20));
Table created.
SQL> create sequence seq_test;
Sequence created.
SQL> create or replace trigger trg_bi_test
2 before insert on test
3 for each row
4 begin
5 :new.id := nvl(:new.id, seq_test.nextval);
6 end;
7 /
Trigger created.
SQL> insert into test (col) values ('Little');
1 row created.
SQL> insert into test (col) values ('Foot');
1 row created.
SQL> select * from test;
ID COL
---------- --------------------
1 Little
2 Foot
SQL>
Как видите, вам не нужно сначала извлекать его значение, об этом позаботится база данных. Обратите внимание, что производительность, вероятно, пострадает, если вы загрузите много данных, так как триггер сработает для каждой вставленной строки.
Для пользователей, которые используют «старый» подход (который у вас есть), ничего не меняется:
SQL> insert into test (id, col) values (seq_test.nextval, 'Stack');
1 row created.
SQL> select * from test;
ID COL
---------- --------------------
3 Stack
1 Little
2 Foot
SQL>
Посмотрите, поможет ли это.
Если вы знаете, N, количество записей в SAS, которое вам нужно вставить, вы можете выполнить сквозной запрос, чтобы получить N следующих значений из последовательности.
%let N_SEQ_NEEDED = 1000;
Proc SQL;
connect to oracle …;
create table work.sequence_numbers as select * from connection to oracle (
SELECT
ROWNUM n,
THE_NEEDED_SEQUENCE.nextval sequence_value
FROM (
SELECT 1 arbitrary_alias
FROM dual
CONNECT BY LEVEL <= &N_SEQ_NEEDED
)
);
Метод CONNECT BY из http://www.orafaq.com/wiki/Oracle_Row_Generator_Techniques
Не гарантируется последовательная природа N следующих значений вам просто нужно знать, что они уникальны и никогда не повторится в будущем.
Объедините или обновите свой набор данных SAS, назначив полученные значения sequence_values столбцу последовательности в наборе данных, а затем выполните INSERT в Oracle с помощью своего кода SAS.