purebasic.info

PureBasic forum
Текущее время: Вс июл 22, 2018 11:31 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 26 ]  На страницу 1, 2  След.
Автор Сообщение
СообщениеДобавлено: Вс июн 14, 2015 7:11 pm 
Не в сети
профессор

Зарегистрирован: Чт сен 22, 2011 6:21 pm
Сообщений: 232
Благодарил (а): 31 раз.
Поблагодарили: 22 раз.
Пункты репутации: 0
Преамбула:
как известно добавляем элемент в список при помощи:
"Result = AddElement(List())"
причем про Result в справке сказано следующее:
"Returns non-zero if the new element was created and zero otherwise. The value returned is a pointer to the new element data. "
что по русски звучит примерно так:
возвращает указатель на вновь созданный элемент списка, или 0 в случае неудачи.
а когда она может возникнуть неудача? на сколько я понимаю только при нехватки памяти(других причин придумать не удалось)
А теперь самое интересное, при нехватке памяти:
1) действительно возвращает 0 и элемент не создается (это нормально)
2) все существующие элементы доступны и работают (это то-же нормально)
3) все элементы можно удалить, кроме последнего (на нем DeleteElement() крашится с (доступ по адресу 0))
4) ClearList() - крашится
5) FreeList() - крашится

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 
Structure Buf
  idx.i
  buf.q[1024*1024*4]  ;32mb
EndStructure
 
Global NewList Buf.Buf(), idx=1
OpenConsole()
 
PrintN("Free memory befor fill - "+Str(MemoryStatus(#PB_System_FreeVirtual)/(1024*1024))+"mb")
While AddElement(Buf())
  Buf()\idx=idx
  idx+1
Wend
PrintN("Free memory after fill - "+Str(MemoryStatus(#PB_System_FreeVirtual)/(1024*1024))+"mb")
 
PrintN("Last Index - "+Str(Buf()\idx))
PrintN("List size - "+Str(ListSize(Buf())))
 
;ClearList(Buf()) ;<= Crash (if uncomment)
;FreeList(Buf())  ;<= Crash (if uncomment)
 
ForEach Buf()
  PrintN("Index element to delete - "+Str(Buf()\idx))
  DeleteElement(Buf())  ;<= Crash at Last element !!!
Next
 
PrintN("List size - "+Str(ListSize(Buf())))
Input()
 



проверено на 5.24,5.31 (x32-x64) WinXP(32,64)
стоит-ли писать Фреду?
если баян, то как обруливать?
если вопрос зачем такие большие списки - есть необходимость кэшировать данные, как можно больше.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс июн 14, 2015 9:23 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11208
Благодарил (а): 4 раз.
Поблагодарили: 421 раз.
В x64 приложениях тоже при использовании больше 4 ГБ памяти?
Напиши Фреду. Посмотрим что ответит.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн июн 15, 2015 1:15 am 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 70 раз.
Поблагодарили: 81 раз.
Пункты репутации: 24
Потом окажется что это фича какая нибудь :D
Подтверждаю на Win8 x64. Если на виртуалке на Win10 есть смысл протестить - завтра гляну. PB 5.2

_________________
Пурик - лучший язык программирования


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн июн 15, 2015 4:17 am 
Не в сети
профессор

Зарегистрирован: Чт сен 22, 2011 6:21 pm
Сообщений: 232
Благодарил (а): 31 раз.
Поблагодарили: 22 раз.
Пункты репутации: 0
http://forum.purebasic.com/english/viewtopic.php?f=4&t=62423
Никита Однороб думаю на 10-ке излишне (не похоже что система как-то влияет)
Пётр на более 4гб памяти не проверял (нет под рукой) но опять-же врядли это повлияет.
похоже причина именно в списке, похоже в заголовок последнего элемента таки прописывается адрес нового (0 в случае неудачи) и это портит логику. (или как-то так)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс июн 21, 2015 9:40 am 
Не в сети
профессор

Зарегистрирован: Чт сен 22, 2011 6:21 pm
Сообщений: 232
Благодарил (а): 31 раз.
Поблагодарили: 22 раз.
Пункты репутации: 0
Всё оказалось еще страннее, чем казалось :D
оказалось что это не List() портится, это просто команды удаления элементов, не могут работать при нехватке памяти.
И нехватка возникает уж очень рано (имхо).
Вот такой необходимый запас вычислен экспериментальным путем: 1024*1024*250 + SizeOf(ListElement)*16
(что-то сильно дохрена)
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Structure Buf
  idx.i
  buf.a[1024*1024]
EndStructure
 
#Zapas = 1024*1024*250 + SizeOf(Buf)*16
 
Global NewList Buf.Buf(), idx=1
OpenConsole()
 
PrintN("Free memory befor fill - "+Str(MemoryStatus(#PB_System_FreeVirtual)/(1024*1024))+"mb")
While MemoryStatus(#PB_System_FreeVirtual) > #Zapas
  If Not AddElement(Buf())
    PrintN("Broken added at idx="+Str(idx))
  EndIf
  Buf()\idx=idx
  idx+1
  PrintN("Free memory after fill - "+Str(MemoryStatus(#PB_System_FreeVirtual)/(1024*1024))+"mb")
Wend
 
PrintN("Last Index - "+Str(Buf()\idx))
PrintN("List size - "+Str(ListSize(Buf())))
 
ForEach Buf()
  ;PrintN("Index element to delete - "+Str(Buf()\idx))
  DeleteElement(Buf())  ;<= Crash at Last element !!!
Next
 
 
PrintN("List size after deleted - "+Str(ListSize(Buf())))
Input()


кто может на английском более менее членораздельно объясниться, отпишитесь пожалуйста на офф форуме (тема в посте выше)
у меня гуглетранслятор такие перлы выдает... видно что это ни разу не по аглицки :?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс июн 21, 2015 12:44 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 70 раз.
Поблагодарили: 81 раз.
Пункты репутации: 24
Написал, должны понять

_________________
Пурик - лучший язык программирования


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс июн 21, 2015 1:47 pm 
Не в сети
профессор

Зарегистрирован: Чт сен 22, 2011 6:21 pm
Сообщений: 232
Благодарил (а): 31 раз.
Поблагодарили: 22 раз.
Пункты репутации: 0
хм... ваше предложение переводчик переводит как:
Цитата:
По экспериментов мы поняли, что DeleteElement () не работает, если памяти Листа более 1024 * 1024 * 250 + SizeOf ( ListElement ) * 16 . Это оченьмало памяти . Например:

Или совсем гугле-транслятор неправ, или вы не совсем так написали :lol:
(DeleteElement () не работает, если памяти программы остается менее 1024 * 1024 * 250 + SizeOf ( ListElement ) * 16 . Это очень много памяти. ) - как-то так правильно


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс июн 21, 2015 2:14 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 70 раз.
Поблагодарили: 81 раз.
Пункты репутации: 24
DeleteElement() не работает, если список занимает больше N памяти. Это очень мало.

_________________
Пурик - лучший язык программирования


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс июн 21, 2015 2:43 pm 
Не в сети
профессор

Зарегистрирован: Чт сен 22, 2011 6:21 pm
Сообщений: 232
Благодарил (а): 31 раз.
Поблагодарили: 22 раз.
Пункты репутации: 0
не занимает больше N, а остается свободной менше N (причем остается еще достаточно много >250mb, при этом AddElement() еще работает)
(или это на аглицкий не переводится :lol: )


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс июн 21, 2015 3:16 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 70 раз.
Поблагодарили: 81 раз.
Пункты репутации: 24
Я просто не так тебя понял. Исправил

_________________
Пурик - лучший язык программирования


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс июн 21, 2015 4:10 pm 
Не в сети
профессор

Зарегистрирован: Чт сен 22, 2011 6:21 pm
Сообщений: 232
Благодарил (а): 31 раз.
Поблагодарили: 22 раз.
Пункты репутации: 0
Спасибо уважаемый, ждем реакции.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт июн 23, 2015 3:23 am 
Не в сети
профессор

Зарегистрирован: Вс июн 10, 2012 8:18 am
Сообщений: 1294
Благодарил (а): 60 раз.
Поблагодарили: 49 раз.
Пункты репутации: 14
Kuzmat писал(а):
оказалось что это не List() портится, это просто команды удаления элементов, не могут работать при нехватке памяти.

Сдается мне, что без мониторинга памяти тут не обойтись, а Фред вряд ли на это пойдет в списках, т.к. ущерб скорости. Скорей всего отпишется, что самим надо проверять.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс июн 28, 2015 7:11 pm 
Не в сети
профессор

Зарегистрирован: Чт сен 22, 2011 6:21 pm
Сообщений: 232
Благодарил (а): 31 раз.
Поблагодарили: 22 раз.
Пункты репутации: 0
Что проверять? что памяти больше 250 мег? а если меньше, то извольте нафиг?
как-то это не совсем здравый предел.

List - пожалуй самый удобный элемент PB для хранения данных, заранее неизвестного количества (я уже не представляю, как писать без него). И вот такая бяка, млин.
Для тех кто не осознал всей глубины трагедии поясняю:
1) Невозможно написать программу использующую под данные всю доступную память.
2) Невозможно написать программу которая должна работать параллельно с другой, сильно расходующей ресурсы (например античит для игры - (игра сжирает память - античит падает))
3) Просто невозможно написать стабильную программу (пользователь может параллельно запустить ... ну например браузер со 100500 открытыми вкладками, который сожрет память и наша прога рюхнеца)
4) Попытка перехвата падения (TryCatch) ничего не дает (список заблокирован, ни очистить, ни удалить, что дальше делать - непонятно)

зы. довести-бы до Фреда все это.
зызы. единственно мне не понятно, как оно так долго ни кто не замечал :shock:


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн июн 29, 2015 11:14 am 
Не в сети
профессор

Зарегистрирован: Вс июн 10, 2012 8:18 am
Сообщений: 1294
Благодарил (а): 60 раз.
Поблагодарили: 49 раз.
Пункты репутации: 14
Kuzmat писал(а):
Что проверять? что памяти больше 250 мег? а если меньше, то извольте нафиг?

Ну да. А так ведь можно всю память забить.

Kuzmat писал(а):
2) Невозможно написать программу которая должна работать параллельно с другой, сильно расходующей ресурсы (например античит для игры - (игра сжирает память - античит падает))
3) Просто невозможно написать стабильную программу (пользователь может параллельно запустить ... ну например браузер со 100500 открытыми вкладками, который сожрет память и наша прога рюхнеца)

Я за комментировал в твоем примере удаление, и запустил три копии - ни что не сжирает память и не рухается.
И как я понял MemoryStatus(#PB_System_FreeVirtual) показывает результат для своего процесса, причем он зависит от битности.
Изображение
Нижнее окно - 32-х битная версия, а верхнее - 64-х битная.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн июн 29, 2015 11:20 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11208
Благодарил (а): 4 раз.
Поблагодарили: 421 раз.
MrF писал(а):
верхнее - 64-х битная
В компе 8 терабайт памяти? :shock: :shock:

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 26 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB