Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Создание безразмерного одномерного массива

1.8K
14 июня 2007 года
Death Knight
139 / / 19.02.2006
Как создать безразмерный массив. Т е мне надо данные из файла считать в массив обьявить массив больше 65535 у меня не получилось поэтому я могу только открывать файлы размером не балее 64 кб, а надо хотя бы 3-5 метров
63
14 июня 2007 года
Zorkus
2.6K / / 04.11.2006
Цитата: Death Knight
Как создать безразмерный массив.


Может, лучше использовать динамический массив?

Цитата: Death Knight

Т е мне надо данные из файла считать в массив обьявить массив больше 65535 у меня не получилось поэтому я могу только открывать файлы размером не балее 64 кб, а надо хотя бы 3-5 метров


1) Больше 65535 чего? Элементов, или суммарной памяти?
2) Какая OS, среда?
3) Покажи участки кода.

1.8K
14 июня 2007 года
Death Knight
139 / / 19.02.2006
Сори забыл написать... ос винХР среда delphi pascal.
У меня 65535 элементов вот код обьявления

const nmax = 65535;
type diapazon = 1..nmax;
masstr = array[diapazon] of char;
var mas :^masstr;
497
14 июня 2007 года
IL84
267 / / 24.04.2003
Специально для работы с большими файлами придумали их проецировать в память. Смотри API-функции CreateFileMapping и MapViewOfFile.
1.8K
14 июня 2007 года
Death Knight
139 / / 19.02.2006
так мне потом еще его сортировать надо будет... с масив проще я думаю
268
14 июня 2007 года
Михаил
587 / / 25.06.2005
Цитата: Death Knight
так мне потом еще его сортировать надо будет... с масив проще я думаю



проще наверное будет с потоком: TFileStream

1.8K
14 июня 2007 года
Death Knight
139 / / 19.02.2006
не совсем понятно как его сортировать тем более что мне нужна м=именно параллельная сортировка...
268
14 июня 2007 года
Михаил
587 / / 25.06.2005
в твоем распоряжении максимум 2 гб памяти, если ты хочешь выделять ее статически:
 
Код:
var c:array[1..5*1024*1024] of byte - 5 мб

динамически:
 
Код:
var c:pointer;

getmem(c, 5*1024*1024)
1.8K
14 июня 2007 года
Death Knight
139 / / 19.02.2006
При обьявлении статически при компиляции ошибок не возникает, при работе происходит переполнение буфера. Динамически непонятно как тогда обращаться поэдлементно к этой помяти, кака к массиву не работает.
268
14 июня 2007 года
Михаил
587 / / 25.06.2005
при статическом выделении памяти память выделяется в стеке, отсуда выход - резервируй под стек необходимое количество памяти (Project-Options-Linker)
либо выделяй память динамически. У тебя будет указатель на начало блока (переменная типа pointer), при необходимости обращения к части блока просто сдвигай этот указатель на необходимое количество байт:
допустим необходимо обратится к 1-ому байту (нумерация начинается с 0)
 
Код:
var c:pointer;
byte(pointer(dword(c)+1)^)=10
1.8K
14 июня 2007 года
Death Knight
139 / / 19.02.2006
Спасибо теперь статически работает... Динамически потом попробую... И тогда еще один последний вопрос на что влияет размер стека т е почему бы его размер не сделать сразу большим?? может на обьем программы или на треб память или еше чего...
268
14 июня 2007 года
Михаил
587 / / 25.06.2005
Стековая память программы занимает виртуальную память операционной системы. Ну, если у тебя вызывается несколько прцедур/функций с суммарной потребностью в стековой памяти в несколько килобайт, то очевидно нет необходимости резервировать под стек 5 мб.
350
14 июня 2007 года
cheburator
589 / / 01.06.2006
Цитата: Михаил
Стековая память программы занимает виртуальную память операционной системы. Ну, если у тебя вызывается несколько прцедур/функций с суммарной потребностью в стековой памяти в несколько килобайт, то очевидно нет необходимости резервировать под стек 5 мб.



Стек автоматически расширяется. Но проблема в том, что есть куча (динамическая область памяти), которая тоже автоматически расширяется. Причем куч, в принципе, может быть несколько. И есть множество других областей памяти - код, память ядра и т. д. Так что даже при наличии виртуального адресного пространства в 4 ГБ все равно расширение упрется в другую область где-нибудь на паре сотен Мб.
А размер стека в настройках проекта, насколько мне известно, задает только начальный размер стека, а он, повторяю, может расширяться.
Можно выделить свою собственную область памяти (не в куче, а вообще - свою область), и сразу зарезервировать под нее побольше места, если заранее известно, что это место будет активно использоваться (я резервировал порядка 2,5 Гб, работало). Это не напряг для системы - ведь память можно не выделять реально, а просто резервировать, так, чтобы ее никто (в смысле, никакая другая область) не могла выделить или зарезервировать. А собственно выделение производить по мере необходимости. См. VirtualAlloc. Но проблема "упирания" в другие области остается.
А вообще, сортировка и все такое прочее легко производятся при отображении файлов на память, поскольку работа тут идет так же, как с памятью - не нужно вызывать операции чтения/записи файлов. Просто работаем с переменными. Но проблема ограничения памяти остается. Из этой проблемы есть выход - отображать файл на память окнами - создать несколько окон, спозиционированных в разные места файла, как только требуется читать/писать данные в другое место, куда нет окна - создавать новое окно, если кончилось адресное пространство - закрывать какое-то из других окон, которое не используется. См. CreateFileMapping и MapViewOfFile. Точно не знаю, но подозреваю, что некоторые СУБД могут пользоваться подобным алгоритмом.
Отмечу, что создание отображения в память не означает, что данные тут же прочитаются из файла - нет, операция практически мгновенная, данные будут читаться страницами при первом обращении к странице.

Все вышеописанное касается исключительно Windows.
...
А что, в Delphi/Kylix (я по ним не специалист) действительно существует такая проблема, как динамическое выделение памяти???

268
14 июня 2007 года
Михаил
587 / / 25.06.2005
Цитата: cheburator

А что, в Delphi (я по ним не специалист) действительно существует такая проблема, как динамическое выделение памяти???


нет проблем с динмическим выделением памяти :) хош стандартные возможности, хош все API в твоем распоряжении

303
15 июня 2007 года
makbeth
1.0K / / 25.11.2004
Я думаю, наиболее простым выходом из ситуации будет использование класс TMemoryStream, у которого есть метод LoadFromFile. Память под содержимое файла он выделит автоматически. Далее можно использовать свойство Memory для доступа к выделенной памяти.
Мучения с CreateFileMapping/MapViewOfFile ради 3-5Мб - ИМХО, того не стоят...
350
15 июня 2007 года
cheburator
589 / / 01.06.2006
Цитата: Михаил
нет проблем с динмическим выделением памяти :) хош стандартные возможности, хош все API в твоем распоряжении


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

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог