Массивы. Большие массивы.

Предыдущая тема Следующая тема Перейти вниз

Массивы. Большие массивы.

Сообщение  Vadim Weinberg в Пт Ноя 12, 2010 7:33 am

Хотел сделать ОЧЕНЬ БОЛЬШОЙ массив, но не получилось. Стал разбираться.
В Help'е (FB-manual-2010-08-10.chm), в разделе "Standard Data Type Limits" написано:


Maximum Subscript Range -------- [-2147483648, +2147483647]
Maximum Elements per Dimension - +2147483647
Minimum/Maximum Dimensions ---- 1/9
Maximum Size (in bytes) --------- +2147483647

Сразу скажу - 9-мерный массив создать не удалось, только 8-мерный. Neutral
И Максимальный Размер меня расстроил. Маловато показалось. Но наверное это предел
адресного пространства (кажется так называется) 2^31, и ограничения здесь не FB устанавливает,
а архитектура процессора и ОС. Вобщем 2Gb и всё. Больше не дано.

Прикинул, как можно развернуться в этих 2G

Код:

Const ArrLimit=2147483647

? "Максимальный размер симметричного массива из Byte & UByte"
For n As Integer=1 To 9
   ? Using "##-dimensions - ########## elements.";n,ArrLimit^(1/n) 'USING РУССКИЕ БУКВЫ НЕ ПОНИМАЕТ %=(
Next
? "Максимальный размер симметричного массива из Short & UShort"
For n As Integer=1 To 9
   ? Using "##-dimensions - ########## elements.";n,(ArrLimit/2)^(1/n) 'USING РУССКИЕ БУКВЫ НЕ ПОНИМАЕТ %=(
Next
? "Максимальный размер симметричного массива из Integer, UInteger & Single"
For n As Integer=1 To 9
   ? Using  "##-dimensions - ########## elements.";n,(ArrLimit/4)^(1/n) 'USING РУССКИЕ БУКВЫ НЕ ПОНИМАЕТ %=(
Next
? "Максимальный размер симметричного массива из LongInt, ULongInt & Double"
For n As Integer=1 To 9
   ? Using "##-dimensions - ########## elements.";n,(ArrLimit/8)^(1/n) 'USING РУССКИЕ БУКВЫ НЕ ПОНИМАЕТ %=(
Next
Sleep
Если будите запускать - "Save As Unicode"

Получил следующее:

Максимальный размер симметричного массива из Byte & UByte
1 dimensions - 2147483647 elements.
2 dimensions - 46341 elements.
3 dimensions - 1290 elements.
4 dimensions - 215 elements.
5 dimensions - 74 elements.
6 dimensions - 36 elements.
7 dimensions - 22 elements.
8 dimensions - 15 elements.
9 dimensions - 11 elements.
Максимальный размер симметричного массива из Short & UShort
1 dimensions - 1073741824 elements.
2 dimensions - 32768 elements.
3 dimensions - 1024 elements.
4 dimensions - 181 elements.
5 dimensions - 64 elements.
6 dimensions - 32 elements.
7 dimensions - 20 elements.
8 dimensions - 13 elements.
9 dimensions - 10 elements.
Максимальный размер симметричного массива из Integer, UInteger & Single
1 dimensions - 536870912 elements.
2 dimensions - 23170 elements.
3 dimensions - 813 elements.
4 dimensions - 152 elements.
5 dimensions - 56 elements.
6 dimensions - 29 elements.
7 dimensions - 18 elements.
8 dimensions - 12 elements.
9 dimensions - 9 elements.
Максимальный размер симметричного массива из LongInt, ULongInt & Double
1 dimensions - 268435456 elements.
2 dimensions - 16384 elements.
3 dimensions - 645 elements.
4 dimensions - 128 elements.
5 dimensions - 49 elements.
6 dimensions - 25 elements.
7 dimensions - 16 elements.
8 dimensions - 11 elements.
9 dimensions - 9 elements.

В реальности - немного меньше. Так например:

2-мерный UShort - 31618 (расчётно 32768).
2-мерный Integer - 22386 (расчётно 23170).
2-мерный LongInt - 15808 (расчётно 16384).

Вывод: нужен массив побольше - пользуемся Short/UShort и даже Byte/UByte, экономим память.

Естественно, не получиться пльзоваться двумя "максимальными" массивами в одной программе. Точнее, иногда,
удаётся создать несколько "максимальных" массивов, но при попытке пользоваться вторым - получаем ошибку.
В этом примере - два "полумаксимальных" Integer массива (причём превышающие расчётные значения, но работает)

Код:

? Fre()
Dim t As Integer=13800
Dim As Integer i,k
Dim Sh1(t,t) As Integer
For i=0 To t-1
   For k=0 To t-1
      Sh1(i,k)=1
   Next
Next
? Sh1(t-1,t-1)
beep
Dim Sh2(t,t) As Integer
For i=0 To t-1
   For k=0 To t-1
      Sh2(i,k)=2
   Next
Next
? Sh2(t-1,t-1)
Beep
? Fre()
Sleep

Будите запускать - сожрёт всю память, полезет на диск. Второго Beep, придётся ждать дольше первого.

Вот такие ограничения. Проверил, как в VB.NET 2008.
Думал Microsoft обошёл лимит.


Module Module1
Sub Main()
Dim t As Integer = 12000
Dim arrInt(t, t) As Integer
arrInt(1, 1) = 0
Console.Write(arrInt(1, 1))
Console.ReadKey()
End Sub
End Module

12000 для Integer!!!
8504 для Long!!!
ПОЧТИ В ДВА РАЗА МЕНЬШЕ!!! Т.е. доступно примерно 0,5Gb!
Почему-то это меня очень обрадовало. Very Happy
А то думал, что FB - кривой и ограниченный. Нет, в 4 раза менее ограниченный чем VB.NET.

Интересно, что 12000 это сегодня, вчера VB.NET позволил мне 15811 элементов для Integer массива.
В FB таких колебаний нет.

В общем, порадовал меня FB. Хоть и очертились границы, но всё равно, очень просторно. Cool

Vadim Weinberg

Сообщения : 18
Дата регистрации : 2010-07-08
Возраст : 52
Откуда : СПб

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Массивы. Большие массивы.

Сообщение  Саня в Пт Ноя 12, 2010 10:59 pm

нуу, всё познается в сравнении и для некоторых задач, прог и проч.. 2 гига может показаться мало( например, нуу хотя б тот же перебор простых чисел или подбор паролей - дл некоторых алгоритмов нужно Агромадное количество памяти или самый лучший пример - БД и СУБД ), там только и придется использовать внешнюю память, да и для более экономного использования создаются алгоритмы. И наоборот для мелких прог, ну и больших тож, и мегабайта может быть много. То, что с диска начинает страницы дергать, это вааще плохо, скорость падает в фиг знает сколько раз. Если же придется использовать большие массивы, то лучше бы его разбить на несколько маленьких, так шоб размер делился на 4 кб, хотя это и без меня понятно..
И ещё зря, тока с вб сравнивал и по идее, проге должно как бээ доступно 4 гига на расходы... ноо за это вот отвечает ось и железо.
.
avatar
Саня

Сообщения : 65
Дата регистрации : 2010-04-28
Возраст : 23
Откуда : Екатеринбург

Посмотреть профиль http://vkontakte.ru/id30561430#/id57547166

Вернуться к началу Перейти вниз

Re: Массивы. Большие массивы.

Сообщение  Vadim Weinberg в Пт Ноя 12, 2010 11:44 pm

Такие огромные массивы конечно редкость и их надо избегать - память экономить.

Просто натолкнулся на предел и решил его обследовать. Вроде разобрался.

Кстати пытался в VS C++ 2008 достичь предала. Мне больше 1Mb не дали. Наверное надо как-то
"попросить". В Borland TC/C++, было 6 моделей памяти. От TINY (вся программа умещалась в 64Kb, и получался .COM файл), до LAGE или HUGE (точно не помню), там был доступ ко всей памяти. И это указывалось в командной строке компилятора. Наверное и в VS C++, что-то такое есть.

Ну её эту Си, мне и 1Gb пока хватит.

Vadim Weinberg

Сообщения : 18
Дата регистрации : 2010-07-08
Возраст : 52
Откуда : СПб

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Массивы. Большие массивы.

Сообщение  Саня в Сб Ноя 13, 2010 1:35 pm

в FB размер стека по умолчанию ставится 1 мб, в некоторых компиляторах С нуу тож стоит такое, и скорей всего, просто это зависит от самого компилера, размер стека в большинстве ставится 1 мб( нуу кроме, пожалуй, компилеров для функциональных языков), соответственно, если прога выйдет за этот предел, то завершится с ошибкой, по моему из-за этого в vc++ Не получилось, хотяя..
судя по описанию в вики, Borland Turbo C++ сделан под дос и следовательно, как для 16 разрядных компов. А там сегментная адресация памяти. вся память делилась на сегменты по 64 кб, ну и в зависимости от того скоко сегментов нужно под код(сегмент cs - "code segment", а скоко под данные( ds - "data segment"), стек ( ss - "stack segment" ) и сколько ещё просто на мелочи( дополнительные три сегмента, которые могут как для кода так и для данных ), выбирается модлеь памяти, large, huge не обязательно означает доступ ко всей памяти, тем более, что может ещё захавать память из эээ какой-то дополнительной области. Чот мне припоминается, что там всего 14 сегментов, но программеру можно использоать из них, но это не точно, как и ывсе вышесказанное.
Fbc - компилятор на 32разрядные компы, и дос в нем эмулируется( как я понимаю в борланде дос тоже как бээ эмулируется, или чооо), поэтому изначально поддерживает плоский режим.
ну, как-то так всё это
avatar
Саня

Сообщения : 65
Дата регистрации : 2010-04-28
Возраст : 23
Откуда : Екатеринбург

Посмотреть профиль http://vkontakte.ru/id30561430#/id57547166

Вернуться к началу Перейти вниз

Re: Массивы. Большие массивы.

Сообщение  Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения