Python Остановка работает, а затем вызывает всплеск памяти - PullRequest
0 голосов
/ 23 февраля 2020

Я запускаю большой Python3 .7 скрипт с использованием PyCharm и интерфейсом Django, который построчно анализирует текстовые файлы и обрабатывает текст. Он застревает в определенный момент в одном особенно большом файле, и я не могу понять, почему. Как только он застревает, память, которую PyCharm использует в соответствии с диспетчером задач, занимает до 100% свободного времени в течение 5-10 секунд, и мне приходится вручную останавливать выполнение (использование памяти низкое, когда он запускается на других файлах и до выполнение останавливается на большом файле).

Я сузил проблему до следующего l oop:

i = 0
for line in line_list:
    label_tmp = self.get_label(line)  # note: self because this is all contained in a class
    if label_tmp in target_list:
        index_dict[i] = line
    i += 1
    print(i)  # this is only here for diagnostic purposes for this issue

Это прекрасно работает для нескольких файлов, которые я ' мы проверили его, но в файле проблемы он остановится на 2494-й итерации (ie при i = 2494). Он делает это, даже когда я удаляю 2494-ю строку файла или когда я удаляю первые 10 строк файла - так что это исключает ошибку в коде любой конкретной строки в файле - он останавливается независимо от того, что в 2494-й строке.

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

log.write('Check1\n')  
log.write('Check2\n')
log.write('Check3\n')
log.write('Check4\n')

На 2494-й итерации последней записью в файле журнала является «Check2». Если я внесу некоторые изменения в функцию, она остановится на проверке 4; если я сделаю другие изменения, он остановится на итерации 2493, но остановится на «Check1» или даже сделает все до конца функции.

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

Независимо от того, что я делаю, выполнение останавливается, тогда память, используемая в соответствии с диспетчером задач, работает до 100%. Важно отметить, что память существенно не увеличивается, пока ПОСЛЕ выполнения не застрянет.

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

1 Ответ

0 голосов
/ 23 февраля 2020

Можете ли вы попробовать использовать sys.getsizeof. Что-то должно происходить с этим диктом, который увеличивает память как сумасшедший. Еще можно попробовать использовать обычный терминал / cmd. В противном случае я хотел бы увидеть немного больше кода.

Кроме того, вместо использования i + = 1, вы можете перечислить ваше значение для l oop.

for i, line in enumerate(line_list):

Надеюсь, что это поможет.

(Извините, недостаточно комментариев для комментирования)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...