Создание супер-переменной на 0,5 Гбайт (500 мегабайт)
Сначала создадим таблицу из ОДНОГО МИЛЛИОНА элементов, и каждый элемент этой таблицы будет содержать 500 символов. То есть примерно 500 мегабайт, полгигабайта. И эта таблица будет находиться в оперативной памяти RAM, а не на диске. Если нужно обрабатывать такую таблицу, скорость будет очень высокой, потому что это оперативная память.
Стоит подчеркнуть, что в такую таблицу вполне может поместиться избирательный список средней или крупной провинции с миллионом избирателей. И у нас ещё останется 1,2 гигабайта свободными…
Не страшно, если сейчас небольшая программа, которую я использую в видео ниже, понятна не на 100%, но я постараюсь, чтобы всё было ясно:
Код: Выделить всё
1 Clear Screen
2 Dim tabla$(1000000)
3 cadena$ = String$("A",500)
4 print "Начинаю присваивать значения таблице из 1 миллиона элементов"
5 for i = 1 to 1000000
6 tabla$(i) = cadena$
7 next i
8 print "Я закончил присваивать миллион элементов"
9 t$ = Inkey$
10 for i = 1 to 1000000 step 1000
11 print tabla$(i)
12 next i
13 Sub String$(a$,Longitud)
14 Local x, b$
15 b$ = ""
16 For x = 1 to Longitud
17 b$ = b$ + a$
18 next x
19 Return b$
20 End Sub
21 End
Примечание: номера строк в программе выше приведены только для ссылок на строки в этом уроке. В реальной программе, показанной в видео, их нет.
Инструкция №2 резервирует место в оперативной памяти, задавая размер переменной Tabla$ в один миллион элементов с помощью оператора DIM, который служит для… задания размеров таблиц и/или матриц.
Так: DIM Tabla$(1000000)
Теперь у нас зарезервирован миллион алфавитно-цифровых элементов (переменная Tablaсодержитсимвол‘содержитсимвол‘` в конце, что в Basic означает строковый тип).
Хорошо, но сколько символов содержит каждый элемент этой таблицы?
На самом деле фиксированный размер заранее не выделяется: каждый элемент будет содержать некоторое количество символов, которое не обязано быть одинаковым для всех.
Ещё одна вещь, которую стоит отметить: исчезает и предел в 255 символов для строковой переменной. Строковую переменную можно заполнить огромным количеством символов. В нашем случае мы поместим по 500 символов в каждый элемент. Чтобы присвоить значение миллиону элементов переменной Tabla$, мы не будем использовать миллион инструкций одну за другой, а применим приём, называемый циклом (мы рассмотрим его позже).
Строки с 3 по 8 включительно заполняют миллион элементов переменной Tabla$.
Строка 3: присваивает переменной Cadena$ строку из 500 букв «A».
Строка 4: выводит сообщение на экран.
Строки 5–7: цикл типа For-Next. Он служит для повторения некоторой инструкции n раз.
Строка 8: выводит на экран ещё одно сообщение, чтобы было видно, что цикл for-next завершился.
Обратите внимание: время, которое проходит между строками 4 и 8, — это время выполнения цикла for-next, что даёт представление о скорости компьютера. Конкретно оно показывает, сколько времени занимает присваивание миллиона значений переменной Tabla$.
Строка 9: останавливает программу до нажатия любой клавиши.
Строки 10–12: ещё один цикл for-next, но на этот раз для вывода на экран элементов переменной Tabla$, которые печатаются с помощью оператора Print (печать) в строке 11. Эти три строки очень важны, потому что показывают, действительно ли всё сработало или программа «падает» и зависает. В видео видно, что всё работает. Это означает, что YaBasic может работать — пока что — с половиной гигабайта, и притом с одной-единственной переменной (Tabla$).
Строки 13–20: это подпрограмма, которая была вызвана в строке 3 для заполнения переменной Cadena$ пятьюстами буквами «A». Подпрограммы выполняются только тогда, когда их вызывают (как это было сделано в строке 3). Поэтому, когда указатель программы доходит до подпрограммы, он перепрыгивает через неё, не выполняя. Таким образом, мы доходим до последней строки 21, где стоит оператор End, означающий «Завершить программу».
В видео я провожу дополнительные проверки, например увеличиваю размер Tabla$ с 1 000 000 элементов до 3 500 000 элементов. Программа продолжает работать, а это означает, что используется уже не 0,5 гигабайта, а примерно 1,75 гигабайта.
По сравнению с тем, что было доступно в первых Basic, это огромный объём памяти, и, если я не ошибаюсь, он позволит делать очень и очень интересные вещи…