Может ли кто-нибудь объяснить мне эту ошибку? - PullRequest
0 голосов
/ 27 марта 2012

Я только что получил следующую ошибку, и я понятия не имею, что с этим делать.

Unhandled exception in thread started by <bound method Timer.__bootstrap of <Timer(Thread-3, stopped -1234564240)>>
Traceback (most recent call last):
  File "/usr/lib/python2.7/threading.py", line 525, in __bootstrap
    self.__bootstrap_inner()
  File "/usr/lib/python2.7/threading.py", line 565, in __bootstrap_inner
    (self.name, _format_exc()))
  File "/usr/lib/python2.7/traceback.py", line 241, in format_exc
    return ''.join(format_exception(etype, value, tb, limit))
  File "/usr/lib/python2.7/traceback.py", line 141, in format_exception
    list = list + format_tb(tb, limit)
  File "/usr/lib/python2.7/traceback.py", line 76, in format_tb
    return format_list(extract_tb(tb, limit))
  File "/usr/lib/python2.7/traceback.py", line 101, in extract_tb
    line = linecache.getline(filename, lineno, f.f_globals)
  File "/usr/lib/python2.7/linecache.py", line 14, in getline
    lines = getlines(filename, module_globals)
  File "/usr/lib/python2.7/linecache.py", line 40, in getlines
    return updatecache(filename, module_globals)
  File "/usr/lib/python2.7/linecache.py", line 133, in updatecache
    lines = fp.readlines()
MemoryError

Соответствующий код (хотя я не уверен, действительно ли он актуален - это только единственная часть моего кода, которая каким-либо образом упоминается в исключении):

class Timer(threading.Thread):
    def __init__(self, interval, callback, limit=0, args=[], kwargs={}):
        threading.Thread.__init__(self)
        self.interval = interval / 1000.0
        self.callback = callback
        self.limit = limit
        self.args = args
        self.kwargs = kwargs
        self.iterations = 0
        self._stop = threading.Event()

    def restart(self):
        self.iterations = 0
        self._stop.clear()
        threading.Thread.__init__(self)
        self.start()

    def run(self):
        while not self._stop.wait(self.interval):
            self.callback(*self.args, **self.kwargs)
            self.iterations += 1
            if self.limit > 0 and self.iterations >= self.limit:
                break

    def stop(self):
        self._stop.set()

    def stopped(self):
        return self._stop.isSet()

Я думаю, что примерно в это время сервер, на котором я выполнял код, разваливался - это был только симптом или это указывало на проблемы с моим кодом где-то еще? В основном, хотя, я просто хочу знать, что, черт возьми, это значит, я, вероятно, могу выяснить все остальное.

Ответы [ 2 ]

2 голосов
/ 27 марта 2012

Вам не хватило памяти.Из документов python об исключениях :

исключение MemoryError

Возникает, когда операции не хватает памяти, но ситуация все еще может быть спасена (путем удаления некоторых объектов).Соответствующее значение представляет собой строку, указывающую, какой (внутренней) операции не хватило памяти.Обратите внимание, что из-за базовой архитектуры управления памятью (функция malloc () C) интерпретатор не всегда может полностью восстановиться в этой ситуации;тем не менее, возникает исключение, чтобы можно было напечатать трассировку стека в случае, если причиной была запущенная программа.

Итак, вы либо:

  • Закончилисьсистемная память (вы заполнили всю свою физическую оперативную память и весь файл подкачки.) Это вполне возможно сделать, если у вас был цикличный цикл, который очень быстро создавал множество данных.
  • Вы столкнулись с 2 ГБ наограничение оперативной памяти.

Обратите внимание, что Python в 32-битных системах имеет ограничение памяти 2 ГБ, независимо от того, сколько у вас физического ОЗУ или включен PAE.Это не зависит от Python - это ограничение операционной системы.

Вероятно, проблема возникла не из-за класса Timer, просто из-за того, что у вас кончилось , не хватилопамяти при выполнении чего-либо с Timer.

0 голосов
/ 27 марта 2012

Из Документов Python ...

exception MemoryError
    Raised when an operation runs out of memory but the situation may still be rescued
    (by deleting some objects). The associated value is a string indicating what kind
    of (internal) operation ran out of memory. Note that because of the underlying
    memory management architecture (C’s malloc() function), the interpreter may not
    always be able to completely recover from this situation; it nevertheless raises
    an exception so that a stack traceback can be printed, in case a run-away program
    was the cause.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...