PyQt5 QMediaPlayer не работает в пространстве имен класса [duplicate]

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

Если у вас проблемы с блокировкой, выполните управление версиями и очистите свой код.

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

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

Справедливости ради, вот два специальных сценария, в которых подсказка nolock может предоставить полезность

1) База данных SQL Server до 2005 года, которая должна запускать длительный запрос в отношении текущей базы данных OLTP, это может быть единственный способ

2) Плохо написанное приложение, которое блокирует записи и возвращает управление пользовательскому интерфейсу и считывающим устройствам, блокируется неограниченно. Nolock может быть полезен здесь, если приложение не может быть исправлено (сторонний и т. Д.), А база данных либо до 2005 года, либо управление версиями не может быть включено.

9
задан Donbeo 13 August 2014 в 14:05
поделиться

4 ответа

Реализации используют подсчет ссылок, чтобы определить, когда нужно удалить переменную.

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

def a():
    x = 5 # x is within scope while the function is being executed
    print x

a()
# x is now out of scope, has no references and can now be deleted

Кроме клавиш словаря и элементы в списках, как правило, очень мало причин вручную удалять переменные в Python.

Хотя, как сказано в ответах на , этот вопрос , использование del может быть полезно, чтобы показать намерение .

7
ответ дан Community 4 September 2018 в 07:54
поделиться

Это зависит от реализации и типа переменной. Для простых объектов, таких как int, есть некоторые оптимизации. Например, в CPython простой int будет повторно использовать одну и ту же память даже после использования del. Вы не можете рассчитывать на это, но это иллюстрирует, что вещи сложнее, чем они появляются.

Помните, что когда вы del вы удаляете имя, это не обязательно объект. Например:

# x is a np.array and contains a lot of data

Было бы более точно сформулировано как:

# x references a np.array which contains a lot of data

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

Предложите вам посмотреть модуль gc для объяснения и вдохновения. Затем подумайте еще раз.

Если вы получаете «из памяти», то у вас, вероятно, есть фундаментальная проблема с вашим дизайном. Скорее всего, вы загружаете слишком много данных за один раз (попробуйте использовать итераторы?), Или, может быть, ваш код должен быть лучше структурирован.

Я только что видел ваше редактирование. Вам нужен весь этот массив в памяти одновременно? Можете ли вы использовать генератор?

Другой альтернативой является использование базы данных, такой как SQLite или, возможно, shelve

0
ответ дан cdarke 4 September 2018 в 07:54
поделиться

Важно сохранить два понятия отдельно: имена и значения. Переменная в Python - это имя, ссылающееся на значение. Имена имеют область действия: когда вы определяете локальную переменную (путем присвоения значения имени), область видимости переменной является текущей функцией. Когда функция возвращается, переменная уходит. Но это не означает, что значение уходит.

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

Более подробная информация (включая рисунки!) находится здесь: Факты и мифы о именах и значениях Python .

3
ответ дан Ned Batchelder 4 September 2018 в 07:54
поделиться

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

  def xdef(z):
    x = f(z) # x is a np.array and contains a lot of data 
    x0 = x[0]

  def funz(z):
    xdef(z)
    y = f(z + 1) # y is a np.array and contains a lot of data
    y0 = y[0]  

    return y[0], x[0] 

Это приведет к исключению

0
ответ дан user1023380 4 September 2018 в 07:54
поделиться
Другие вопросы по тегам:

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