Ограничение 2 Gb: как справиться? Linux?
Разработал забывный алгоритм, реализацию сделал в Delphi.
Для работы требуется массив булевых очень большого размера.
Столкнулся с такой проблемой: windows отводит программе не более 2 Gb памяти, чего мне совершенно недостаточно. Не хотелсь бы заморачиваться с созданием и убиением массивов(подозреваю, что будет тормозить, а скорость критична).
Может быть в *nix нет такой проблемы? Имеет ли смысл переписать на С (предварительно изучив :-)) под Linux? Если да, то посоветуйте версию компилятора.
Спасибо.
А компилятор: GCC =)))
Последняя версия вроде: 4.1.1
А компилятор: GCC =)))
Последняя версия вроде: 4.1.1[/QUOTE]
Спасибо! Я не великий знаток линуха, насколько смог понять - там настроить можно почти все. Другое дело, что ядро я врядли сумею переписать. Скорректируем вопрос: "Если поставить 64-битный Linux, я смогу адресовать огромную память, но, только в том случае, если позволит система. А она позволит?"
Ну собственно и преимущества 64-битных процесоров и операционных систем так же в том что они позволяют адресовть большие объемы памяти. Соответственно эта проблемма отпадет как для win64 так linux64. И там и там позволит выделить гораздо больше памяти. Если конечно железо позволит, иначе вся эта память будет в свопе на диске ленжать=). А пока в 32битных системах даже элементарно указатели по которым выделяется память в программе сами 32-х битные. И значит выделить им можно не больше 4 гб. В компиляторах для 64битных процессорах указатели уже 64 бита значит могут адресовать около 16 Тбайт памяти.
дык Linux позволит приложению 10 гигов использовать? Пусть будет часть в свопе (с тормозами), я ж понимаю, что оперативная память не бесплатная, да и ограничения есть у материнских плат.
Да должен позвоить так же как и винда 64.
Собственно 64 укзатели - предпологают 16*1024 Гб памяти на адресацию ))
в винду запросто могут вставить лимит для каждого приложения. Одно дело - ширина адресной шины, другое - средний размер оперативки.
В любом случае, спасибо большое. Вчера наваял первый консольный "Хелло мир!", потренируюсь под виндой, потом пойду остальные грабли собирать. Еще раз спасибо.
Линукс может использовать до 64 Гб адресного пространства на х86 системах.
для регулирования использования системных ресурсов используется системный вызов setrlimit
В виртуальном пространстве любого приложения начиная с адреса 0xC000000 начинается ядро. Туда уже никто не пустит. Остались только младшие три гигабайта.
set_rlimit дает мало чего - позволяет установить для себя ограничения на размер сегмента данных. По сути - мы ставим себе границу, за пределы которой нам не дадут вылезти через brk/sbrk - вернут ENOMEM. Ставим больше предел - можно еще немножко памяти себе выделить.
Дальше забавный момент - malloc на большие участки памяти не имеет никакого отношения к сегменту данных. память выделяется где-то в конце адресного пространства, оставляя для стека около 8 мегов. Каждый последующий маллок будет выдавать куски памяти ближе к началу адресов, то есть получается как бы второй стек.
Линукс может использовать до 64 Гб адресного пространства на х86 системах.
[/QUOTE]
Ну насамом деле такое видимо можно сделать не только в Linux. Только это уже извраты с сегментацией памяти, о которых только стали забывать )
Осталь скормить исходник GCC"у. Говорят, нужно с правильными ключами компилить, один чел из нашего города обещал помочь с компиляцией и с дистром 64-битной слаки.
Еще раз спасибо, хороший форум!
гы... нет уж... ты меня цепанул. вечером накачу 32битный линукс под qemu и буду тестить. может даже разразимся статейкой. остальных тоже призываю :)
После проделанного задам вопрос, приводящий к запою: а ты использовал TBits из Classes? По сравнению с массивом Boolean-значений сокращает расход памяти в 8 раз.
Только сегодня зашел в эту тему.
Только сегодня зашел в эту тему.[/QUOTE]
Наверное заметно, что я не программист :) В студенческие годы на фортране поля считал, ОП вообще не знаю.
По моему простому рассуждению булево значение должно бы занимать один бит. Каково было мое удивление, что оно такое же, как byte (эмпирический результат). В другом форуме(у дельфийцев )спрашивал :как создать класс - наследничек от intrger, чтобы ограничить
размер переменной до бита. Меня проигнорили. Все равно не спасет, подумал я, и преписал на ся. Один черт, надо изучать.
А TBits поковыряю...
Ну переменную размером в один бит не создать. Не бывает адресуемых едениц меньше байта. Другое дело что можно вручную реализовывать эту логику и в одной переменной хранить 8 булевых значений (как часто и делают). Исспользовать для записи и считывания отдельных бит битовые операции (&, |, >>, <<). Можно создать класс обертку для упрощения доступа или восспользоваться готовыми.
сие зовется PAE. и вовсе это не изврат :)