purebasic.info

PureBasic forum
Текущее время: Чт дек 14, 2017 1:01 pm

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




Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
 Заголовок сообщения: Что-то с памятью моей стало...
СообщениеДобавлено: Пн авг 21, 2017 2:42 am 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Сб авг 05, 2017 8:34 pm
Сообщений: 41
Откуда: Россия, Брянск
Благодарил (а): 7 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Здравствуйте!
Проводил эксперименты с массивами, а точнее с их размерностью и наткнулся на странную вещь...
Код:
1
Dim a(100000000000000000000) 


PB спокойно принимает, в вот
Код:
1
Dim  b(100000000,3)

упорно не хочет.
Возникает естественный вопрос: почему?
Да, второй массив двумерный, но тип у них один и тот же, т.е. выделяемая память на каждую ячейку массива одна и таже, а 100000000000000000000 куда > чем 40000004....
Так почему же массив большего объема машина принимает, а меньшего не хочет?
Заранее спасибо!

При проведении дополнительных экспериментов выяснилось, что работать можно с гораздо меньшим объемом памяти:
Код:
1
2
3
4
5
Dim a(34000000000)
For i=0 To 9903967
  a(i)=9
Next i
Debug i


Но почему именно 9903967 и как вычислить размер память который можно выделить под массив?
Пока остается загадкой


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Что-то с памятью моей стало...
СообщениеДобавлено: Пн авг 21, 2017 7:40 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вт апр 14, 2009 7:22 pm
Сообщений: 283
Благодарил (а): 1 раз.
Поблагодарили: 9 раз.
Пункты репутации: 0
Например такой код на 32х разрядном копиляторе и 64х разрядной системе работает
Код:
1
2
3
4
5
6
7
8
9
10
Dim  b.w(100000000,3) ; w!!!
 
b(99999999,2) = 999
b(0,0) = 0
 
Debug b(0,0)
Debug b(99999999,2)
 
Debug (100000000*3)*2 ; т.е. умножить на размер w
 


вам сюда http://www.purebasic.com/documentation/ ... ables.html

А ваш код работает без проблем на 64хPb-64хWin

Но в случае необходимости работать на пределе размеров реальной оперативки и (или) ограничений 32х разрядных программ(систем) надёжней самому рулить памятью
т.е.
http://www.purebasic.com/documentation/ ... index.html
http://www.purebasic.com/documentation/ ... tures.html
http://www.purebasic.com/documentation/ ... emory.html


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Что-то с памятью моей стало...
СообщениеДобавлено: Пн авг 21, 2017 8:01 am 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Сб авг 05, 2017 8:34 pm
Сообщений: 41
Откуда: Россия, Брянск
Благодарил (а): 7 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
jobless писал(а):
Например такой код на 32х разрядном копиляторе и 64х разрядной системе работает
Код:
1
2
3
4
5
6
7
8
9
10
Dim  b.w(100000000,3) ; w!!!
 
b(99999999,2) = 999
b(0,0) = 0
 
Debug b(0,0)
Debug b(99999999,2)
 
Debug (100000000*3)*2 ; т.е. умножить на размер w
 


вам сюда http://www.purebasic.com/documentation/ ... ables.html

А ваш код работает без проблем на 64хPb-64хWin

Но в случае необходимости работать на пределе размеров реальной оперативки и (или) ограничений 32х разрядных программ(систем) надёжней самому рулить памятью
т.е.
http://www.purebasic.com/documentation/ ... index.html
http://www.purebasic.com/documentation/ ... tures.html
http://www.purebasic.com/documentation/ ... emory.html


У меня 32-разрядная ОS

Это бы всё да на русском....у меня с Инглишем тяжко


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Что-то с памятью моей стало...
СообщениеДобавлено: Пн авг 21, 2017 8:07 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вт апр 14, 2009 7:22 pm
Сообщений: 283
Благодарил (а): 1 раз.
Поблагодарили: 9 раз.
Пункты репутации: 0
viewtopic.php?f=1&t=861&p=87776&hilit=моя+копилка#p87776


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Что-то с памятью моей стало...
СообщениеДобавлено: Пн авг 21, 2017 12:47 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11070
Благодарил (а): 4 раз.
Поблагодарили: 381 раз.
Селекин Сергей писал(а):
Код:
1
Dim a(100000000000000000000)

PB спокойно принимает
Массив не создается.
Код:
1
2
3
Dim a(100000000000000000000)
Debug ArraySize(a())
a(0) = 10



Селекин Сергей писал(а):
а вот
Код:
1
Dim  b(100000000,3)

упорно не хочет.
Создает
Код:
1
2
3
Dim  b(100000000,3)
Debug ArraySize(b())
b(0, 0) = 10

Но использование памяти на пределе для x86 процесса
Код:
1
2
3
x.q = 100000001 * 4 * SizeOf(Integer)
Debug ""+x+" байт"
Debug StrD(x/1024/1024/1024, 3)+" ГБ"

Если свободного участка памяти такого объема нет, то массив создан не будет.

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

Селекин Сергей писал(а):
При проведении дополнительных экспериментов выяснилось, что работать можно с гораздо меньшим объемом памяти
Код:
1
2
3
4
5
Dim a(34000000000)
For i=0 To 9903967
  a(i)=9
Next i
Debug i

В компе больше 256 ГБ оперативной памяти?
Реальный размер массива
Код:
1
2
Dim a(34000000000)
Debug ArraySize(a())


Размер массива задается 4-ех байтной переменой. В нее не влезет число 34000000000 и его часть пропадает.

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Что-то с памятью моей стало...
СообщениеДобавлено: Пн авг 21, 2017 2:33 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Сб авг 05, 2017 8:34 pm
Сообщений: 41
Откуда: Россия, Брянск
Благодарил (а): 7 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Цитата:
В компе больше 256 ГБ оперативной памяти?

Изображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Что-то с памятью моей стало...
СообщениеДобавлено: Пн авг 21, 2017 2:56 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11070
Благодарил (а): 4 раз.
Поблагодарили: 381 раз.
Тогда зачем создавать массивы требующие объемы памяти которых в компе и близко нет? Тем более что ограничение x86 процесса - 2 ГБ.

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Что-то с памятью моей стало...
СообщениеДобавлено: Пт авг 25, 2017 1:53 am 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Сб авг 05, 2017 8:34 pm
Сообщений: 41
Откуда: Россия, Брянск
Благодарил (а): 7 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пётр писал(а):
Тогда зачем создавать массивы требующие объемы памяти которых в компе и близко нет? Тем более что ограничение x86 процесса - 2 ГБ.

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Что-то с памятью моей стало...
СообщениеДобавлено: Пт авг 25, 2017 10:59 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11070
Благодарил (а): 4 раз.
Поблагодарили: 381 раз.
Нужно умножить число элементов массива на размерность одного элемента.
Допустим этот массив занимает 1001 байт (индексация с нуля и до заданной в объявлении массива, поэтому он содержит на 1 элемент больше чем заданное число).
Код:
1
Dim x.a(1000)

Этот массив занимает 2002 байта
Код:
1
Dim x.u(1000)

этот 4004 байт
Код:
1
Dim x.l(1000)

этот 8008 байт
Код:
1
Dim x.q(1000)



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

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Что-то с памятью моей стало...
СообщениеДобавлено: Пт авг 25, 2017 1:09 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Сб авг 05, 2017 8:34 pm
Сообщений: 41
Откуда: Россия, Брянск
Благодарил (а): 7 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пётр писал(а):
Если массив строковой, то нужно умножить число элементов на длины строк, учитывая что юникодные строки требуют по 2 байта на символ.

А занимает ли память пустая строка в массиве?
Т.е. А$(N)="" - 0 байт или нет?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Что-то с памятью моей стало...
СообщениеДобавлено: Пт авг 25, 2017 4:31 pm 
Не в сети
профессор

Зарегистрирован: Чт сен 22, 2011 6:21 pm
Сообщений: 212
Благодарил (а): 29 раз.
Поблагодарили: 21 раз.
Пункты репутации: 0
Селекин Сергей писал(а):
А занимает ли память пустая строка в массиве?
Т.е. А$(N)="" - 0 байт или нет?

строковый массив, самих строк не содержит, он содержит ареса строк, и соответственно 1 ячейка знанимает 4-8 байт, в зависимости от разрядности, безотносительно есть строка, или нет.


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

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


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

Сейчас этот форум просматривают: Google [Bot] и гости: 5


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

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