Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 11, 2015 23:58:15

new_optimist
Зарегистрирован: 2015-04-11
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Ошибка 10054

Вот часть проблемного кода:

f={}
g={}
raw=V[::]
t = 0
def DFSR(s):
 global D,t,raw,f
 raw.remove(s)
 for u in D[s]:
    if(u in raw):
       DFSR(u)
 t=t+1
 f[s]  = t
 g[t] = s
 print 't = ',t, ', len(raw) = ' ,len(raw), ', len(f) = ',len(f)
При малых размерах списка V все работает правильно, но при больших - программа просто вылетает (pypy-2.5 under python 2.7) без выдачи кода ошибки. Пытался запускать дебагер PyScripter, который выдал такое:
File “<string>”, line 73, in execInThread

File “C:\…\rpyc.zip\rpyc\core\stream.py”, line 166, in read
EOFError:
Но ведь ошибка 10054 - это что-то из работы с сокетами, а у меня никакие инет-соединения не используютя. В чем может быть причина?
П.С. Больно не пинайте, я только недавно начал изучать питон

Офлайн

#2 Апрель 12, 2015 00:08:23

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Ошибка 10054

скорее всего переполнение стека
напишите условие и мы вместе попытаемся сделать без рекурсии
и пример списка V и D



————————————————
-*- Simple is better than complex -*-

Отредактировано terabayt (Апрель 12, 2015 00:09:08)

Офлайн

#3 Апрель 12, 2015 00:39:38

new_optimist
Зарегистрирован: 2015-04-11
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Ошибка 10054

terabayt
скорее всего переполнение стека
напишите условие и мы вместе попытаемся сделать без рекурсии
и пример списка V и D
Переполнение стека уже было и я, кажется, смог его устранить командой sys.setrecursionlimit(1000000000)
Ну на всякий случай: вот полный код:
http://double.vv.si/8.c.py
Здесь варианты входных файлов небольших размеров: http://double.vv.si/mini.rar (с ними все работает хорошо).
А это те большие входные файлы, для которых программа вылетает:
http://double.vv.si/08p2.txt
http://double.vv.si/08d2.txt
http://double.vv.si/08v2.txt
По сути это та часть поиска компонент сильной связности, где нужно каждой вершине V_i приписать значение f_i, приписывемое ей при обходе графа.

Отредактировано new_optimist (Апрель 12, 2015 00:41:12)

Офлайн

#4 Апрель 12, 2015 01:45:02

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Ошибка 10054

да, файлы не маленькие
попробуйте

sys.setrecursionlimit(2**31-1)
а на каком значении t программа вылетает?



————————————————
-*- Simple is better than complex -*-

Офлайн

#5 Апрель 12, 2015 07:35:37

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Ошибка 10054

new_optimist
sys.setrecursionlimit(1000000000)
прикольно, так у тебя поди памяти не хватает



Офлайн

#6 Апрель 12, 2015 10:32:51

new_optimist
Зарегистрирован: 2015-04-11
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Ошибка 10054

terabayt
да, файлы не маленькие
попробуйте
sys.setrecursionlimit(2**31-1)
а на каком значении t программа вылетает?
Попробовал, но ничего не изменилось.
Программа вылетает на t=2552 в pypy-2.5 (вообще без объяснений и кодов ошибок), но если запускаю в дебагере (PyScripter), то дотягивает медленно до t = 10575 и выдает ошибку Errno 10054 в файле C:\Program Files\PyScripter\Lib\rpyc.zip\rpyc\core\stream.py", line 166, in read

Офлайн

#7 Апрель 12, 2015 10:36:43

new_optimist
Зарегистрирован: 2015-04-11
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Ошибка 10054

FishHook
прикольно, так у тебя поди памяти не хватает
Да вроде всего хватает. Когда не хватало памяти, то программа так и “говорила”
RuntimeError: maximum recursion depth exceeded
Именно после этого и было добавлено sys.setrecursionlimit(1000000000)

Офлайн

#8 Апрель 12, 2015 10:51:57

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Ошибка 10054

new_optimist
Когда не хватало памяти, то программа так и “говорила”
Это не о памяти сообщение, а о глубине рекурсии. По умолчанию она ограничена небольшим значением, потому что в питоне она медленная и её следует избегать.



Офлайн

#9 Апрель 12, 2015 10:57:36

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Ошибка 10054

new_optimist
Когда не хватало памяти, то программа так и “говорила”
RuntimeError: maximum recursion depth exceede
Ничего подобного. Программа говорила, что достигнуто ограничение на допустимую глубину рекурсии.
Ничего про занятую память тут не говорится. А вот когда ты это ограничение снял, тут вполне вероятна ситуация, когда рекурсия выжрала всю память, никто её не ограничивает более от этого гнусного поступка.
Это как лифт: если в него нагрузить более допустимого веса, он не поедет, скажет “maximum weight exceed”, но мы самы умные, мы у него мозги подкрутили и сделали ограничение веса не 1000 кг, а sys.set_weight_limit(1000000000), тросы оборвались, лифт упал. И кто виноват?



Отредактировано FishHook (Апрель 12, 2015 10:59:10)

Офлайн

#10 Апрель 12, 2015 11:00:42

new_optimist
Зарегистрирован: 2015-04-11
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Ошибка 10054

FishHook
И кто виноват?
Меня больше интересует не то, кто виноват, а что делать (как добавить питону памяти)?

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version