Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Можно ли в C++ создать массив длиной млрд. байт? 
:(
    Опции темы
EKoshelev
Дата 31.7.2013, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 509
Регистрация: 1.9.2004

Репутация: нет
Всего: нет



Написал вот такую функию:

Код

void PrimeNumbers::on_pushButton_clicked()
{
    char* m_Arr = new char[1000000000];

    for(unsigned long i = 0; i < 1000000000; i++)
        m_Arr[i] = 0xFF;

    delete m_Arr;
}


Программа компилируется и запускается. Когда начинает исполняться приведённая функция вылетает ошибка:
"Unhandled exception at 0x7c812afb in ProjectName.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x0012bb84" на самой первой строке с созданием массива.

Пишу в восьмой студии. Если в обоих случаях сделать на один ноль меньше, то всё отрабатывает.

Ну и вопрос остаётся прежним: "Можно ли таки создать массив длиной 1.000.000.000 байт?".

П. С. Понятно, что мою задачу в принципе можно решить и без такого длинного массива. Интересно принципиально возможно ли такое. Дельфа, например, создаёт такой массив без проблем.


--------------------
Вежливым и адекватным предлагаю общаться на "ты".
PM MAIL   Вверх
bsa
Дата 31.7.2013, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



EKoshelev, все зависит от платформы и системы, на которой работает программа.  В частности, 32-х битная платформа позволяет оперировать чуть более чем 4 млрд байтами.
Я не знаю, почему твоя программа падает. Возможно, необходимо что-то в настройках изменить.
PM   Вверх
SenkraD
Дата 31.7.2013, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

Репутация: 2
Всего: 23



А это все что вы выделяете в программе? Если не ошибаюсь (давно не обновлял для себя инфу), то под процесс выделяется базово 4Gb, с которых ситстемма сразу скушает гиг под свои нужны, потом часть памяти зарезервируется и юзеру(программеру) будет доступно 2Gb, понятно что обьем доступной памяти можно увеличить, но базово было так.

у меня на VS2010 на Win XP SP3:
Код

//--------------------------------------------------------------------------------------------------
#define _CRT_SECURE_NO_WARNINGS


//--------------------------------------------------------------------------------------------------
#include <cstddef>

#include <iostream>
#include <string>


//--------------------------------------------------------------------------------------------------
//
//
int main(int argc, char* argv[])
{
    try
    {
        std::size_t const array_size = 1250000000;
        unsigned char* array = new unsigned char[array_size];
        for(unsigned long i = 0; i < array_size; i++)
        {
            array[i] = 0xFF;
        }
        delete[] array;
    }
    catch (std::exception const& ex)
    {
        std::cout << "Error: " << ex.what() << std::endl;
    }

    std::system("pause");
    return 0;
}

//--------------------------------------------------------------------------------------------------
такая программа работает без bad_alloc, а вот уже 1 300 000 000 выделить не могу, так что смотрите в сторону увелечения HEAP для процесса, если это реально нужно

P.S. Еще есть такая опция

Это сообщение отредактировал(а) SenkraD - 31.7.2013, 11:20


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
Alexeis
Дата 31.7.2013, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Зависит от фрагментации виртуального адресного пространства программы. У меня недавно был трабл, что не мог даже 512Мб выделить одним куском. Dll-ка пакостная влезла посередине адресов и разбила самый большой кусок адресов пополам. В принципе я бы рекомендовал переселяться на 64 бита если нужны длинные массивы. Есть прожка VMMap она позволит посмотреть, кто у вас в проге главный диверсант, который разбил большой кусок адресов.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
EKoshelev
Дата 31.7.2013, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 509
Регистрация: 1.9.2004

Репутация: нет
Всего: нет



SenkraD, с хипом попробовал похимичить - ничего не вышло.


Alexeis, Ага. Пробовал 10 массивов по 100.000.000 создавать - получается. А один на млн. - фиг.


--------------------
Вежливым и адекватным предлагаю общаться на "ты".
PM MAIL   Вверх
volatile
Дата 31.7.2013, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(EKoshelev @  31.7.2013,  12:10 Найти цитируемый пост)
Пробовал 10 массивов по 100.000.000 создавать - получается. А один на млн. - фиг. 

EKoshelev, можно перед запуском дефрагментатор памяти запустить.
были у меня когда-то такие маленькие утилитки (правда не пользовался, нужды не было),
в сети их должно быть.
возможно даже с исходниками, поищите.

PM MAIL   Вверх
Alexeis
Дата 31.7.2013, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



volatile, а смысл? Системе пофиг на фрагментацию памяти, она может непрерывный блок памяти организовать хоть из ста физических блоков оперативы + еще 100 кусков свопа. Скорее всего после такого new система и не освободит гиг памяти, а будет добавлять страницы оперативы по мере появления ошибок доступа к памяти. Другое дело если в системе своп+озу в сумме не будет свободного гига. Тогда, вероятно, пойдет уже отказ по причине нехватки памяти.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
volatile
Дата 31.7.2013, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(Alexeis @  31.7.2013,  13:04 Найти цитируемый пост)
она может непрерывный блок памяти организовать хоть из ста физических блоков оперативы 

Не всегда. Там есть ограничения, напр. минимальный переместимый блок, и много другой всякой мути... ...
Выше пример, наглядное тому подтверждение. память же есть, а непрерывный кусок создать не может.
пусть EKoshelev, попробует, возможно поможет.
Впрочем, утврждать что точно поможет не берусь.



Это сообщение отредактировал(а) volatile - 31.7.2013, 13:39
PM MAIL   Вверх
borisbn
Дата 1.8.2013, 18:58 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



volatile, есть предположение, что не поможет, т.к.
Цитата(EKoshelev @  31.7.2013,  10:39 Найти цитируемый пост)
Дельфа, например, создаёт такой массив без проблем.

Получается, что это CRT студии не может выделить, а не ОС.

2 ТС: я выделял 18 ГБ без проблем. Естественно, на 64-х битной ОС (правда не windows)


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
volatile
Дата 1.8.2013, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(borisbn @  1.8.2013,  18:58 Найти цитируемый пост)
Получается, что это CRT студии не может выделить, а не ОС.

Вы думаете CRT выделяет память каким-то волшебным способом, минуя ОС?
    Насчет того что дельфи выделяет, а студия нет...  мне кажется возможны несколько вариантов.
  • Просто совпадение обстоятельств. Так сложилась временная конфигурация. В другой обстановке (может даже при другом порядке запуска ресурсоемких приложений) может случиться обратное.
  • Возможно что просто сама IDE студии забирает под себя больше чем IDE дельфи. Программу же тестируют, при запущенной IDE... Ну и на тестируемое приложение остается меньше ресурсов. Но к качеству откомпилированного кода, ясно это не имеет отношения.

PM MAIL   Вверх
EgoBrain
Дата 2.8.2013, 01:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 23.3.2008
Где: Комната

Репутация: нет
Всего: 2



В довесок к словам Alexeis о фрагментации вирт. памяти
Цитата

Хотя нам действительно доступно около 2 Гб одним куском (только в самом начале и в самом конце этого региона откушено по 64 Кб на спец. области), но нужно вспомнить, что в этом адресном пространстве лежат не только ваши данные, но и ваш код, библиотеки (DLL), их код и так далее. Даже если вы не загружали библиотек явно в вашем коде - они всё равно будут загружены. Как минимум это kernel32.dll и user32.dll. И дальше всё зависит от того, как именно они загружены. Обычно системные библиотеки загружаются одним большим компактным регионом, расположенном по старшим адресам - поскольку они загружаются с краю адресного пространства, то в центре у вас получается большой кусок для вашей работы. Но если какая-то DLL загружается в середину адресного пространства, то оно оказывается разбито пополам, и вы уже не сможете выделить память одним куском (но всё ещё можете выделить её в два или три куска).

Миф №3
Ну и про архитектуру памяти статья.

То есть получается, большие куски могут быть разбиты доп. данными и командами. Вопрос в том, как с этим бороться..
PM MAIL ICQ Skype   Вверх
volatile
Дата 2.8.2013, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(borisbn @  1.8.2013,  18:58 Найти цитируемый пост)
что это CRT студии не может выделить

У меня выделяет. (2008 студия) 
Код

typedef unsigned int ui;
int main ()
{
   const ui mb = 1024*1024;
   const ui blok_size = 100*mb;

   for (ui i = 1; i < 30; ++ i)
   {
      ui size = i * blok_size;
      printf ("try allocate: %5u Mb\n", size / mb);
      char *p = new char [size];
      
      delete [] p;
   }
}


Код

try allocate:   100 Mb
try allocate:   200 Mb
try allocate:   300 Mb
try allocate:   400 Mb
try allocate:   500 Mb
try allocate:   600 Mb
try allocate:   700 Mb
try allocate:   800 Mb
try allocate:   900 Mb
try allocate:  1000 Mb
try allocate:  1100 Mb
try allocate:  1200 Mb
try allocate:  1300 Mb
try allocate:  1400 Mb
try allocate:  1500 Mb
try allocate:  1600 Mb
try allocate:  1700 Mb
try allocate:  1800 Mb

Это в дебаге!
В релизе так вообще до 2000 мб доходит, но я сомневаюсь что там не соптимизировалось, уж очень быстро печатает.
В дебаге каждая строчка (особенно последние) занимает ощутимое время, то есть происходит реальное выделение памяти.
Система XP 32 разр., на борту 3 гига оперативы. Запущена студия, опера, IE, и еще куча всяких мелочей.

Напомню 2 гига - теоретический предел для 32 разрядных. (можно теоретический предел увелить до 3 гб, но это надо капаться в настройкх системы.)

Цитата(EgoBrain @  2.8.2013,  01:54 Найти цитируемый пост)
Вопрос в том, как с этим бороться.. 

Цель вышеописанного теста была выяснить этот вопрос. но повторить проблему пока не удалось 



PM MAIL   Вверх
DarthTon
Дата 2.8.2013, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 7.2.2009

Репутация: нет
Всего: 6



Как уже сказал Alexeis, всё зависит от фрагментации адресного пространства процесса. Если в нём будет свободный блок нужного размера - массив будет создан.

Цитата

Дельфа, например, создаёт такой массив без проблем. 

Просто Вам повезло. Например, благодаря ASLR, образы модулей, база кучи и область стека потоков разместились в адресном пространстве так, что осталось место для массива.

Цитата

В релизе так вообще до 2000 мб доходит, но я сомневаюсь что там не соптимизировалось, уж очень быстро печатает.
В дебаге каждая строчка (особенно последние) занимает ощутимое время, то есть происходит реальное выделение памяти.

Основное замедление при выделении из хипа в дебаг версии занимает забивание выделенной памяти дебажной CRT сигнатурой. В придачу выделяются дополнительные байты перед и после каждого блока для детекта Heap Undelfow и Overflow(становится заметно при большом количестве мелких выделений).

Цитата

Вопрос в том, как с этим бороться.. 

Использовать х64.
PM MAIL   Вверх
akizelokro
Дата 5.8.2013, 06:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Код

Программа компилируется и запускается. Когда начинает исполняться приведённая функция вылетает ошибка:
"Unhandled exception at 0x7c812afb in ProjectName.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x0012bb84" на самой первой строке с созданием массива.


Взял ваш код, откомпилил под VS 2010 32х разрядная XP и запустил, всё работает нормально.
Указывайте либо характеристики вашего компьютера (память), либо опции компиляции проекта.
Или тогда считайте, что вы сервиспак какой-то не поставили, или, что одно и то же, это какие-то родимые пятна вашего экземпляра компилятора

Это сообщение отредактировал(а) akizelokro - 5.8.2013, 06:40


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
EgoBrain
Дата 5.8.2013, 08:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 23.3.2008
Где: Комната

Репутация: нет
Всего: 2



Цитата(DarthTon @ 2.8.2013,  18:26)
Цитата

Вопрос в том, как с этим бороться.. 

Использовать х64.

А что, на платформе x64 виртаульная память по-другому распределяется с избежанием фрагментации?
Имеется ввиду как бороться с фрагментацией..

Это сообщение отредактировал(а) EgoBrain - 5.8.2013, 08:22
PM MAIL ICQ Skype   Вверх
Alexeis
Дата 5.8.2013, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(EgoBrain @  5.8.2013,  09:22 Найти цитируемый пост)
А что, на платформе x64 виртаульная память по-другому распределяется с избежанием фрагментации?

  На платформе 64 адресов во много раз больше чем памяти. Это получается почти как система с бесконечной памятью. Фрагментация адресного пространства начнет волновать лет через 500 . 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
akizelokro
Дата 5.8.2013, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Цитата

А что, на платформе x64 виртаульная память по-другому распределяется с избежанием фрагментации?
Имеется ввиду как бороться с фрагментацией..


На 32х разрядной XP есть не очень хорошее наследство в виде болезней роста. То для видеодрайвера дыра предусмотрена, то сначала у них было одно ограничение, драйвера писались под 2Gb, ну, там заморочено.

Вообщем, у меня памяти стоит 2,5Gb, и всё компилируется.
Есть ещё возможность поиграться с опциями компилятора, /Zm например убрать и увеличить, соответственно, память для хипа. Надо не только код в таких случаях приводить, но и размер свободной памяти перед выполнением, и размер всей памяти, а также настройки проекта (опции компилятора).

Добавлено через 1 минуту и 49 секунд
Цитата(Alexeis @  5.8.2013,  09:31 Найти цитируемый пост)
На платформе 64 адресов во много раз больше чем памяти. Это получается почти как система с бесконечной памятью. Фрагментация адресного пространства начнет волновать лет через 500 .  


На 32х разрядных серверных платформах нет ограничения в 4Gbю Тут стоит говорить именно об XP.

Добавлено через 4 минуты и 30 секунд
И даже исполняется, не только компилируется. В дебаггере проверил).


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
Alexeis
Дата 5.8.2013, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(akizelokro @  5.8.2013,  12:38 Найти цитируемый пост)
На 32х разрядных серверных платформах нет ограничения в 4Gbю Тут стоит говорить именно об XP.

  Ну не совсем так. Если верить википедии, то 
Цитата

Physical Address Extension (PAE) — режим работы встроенного блока управления памятью x86-совместимых процессоров, в котором используются 64-битные элементы таблиц страниц (из которых для адресации используются только 36 бит), c помощью которых процессор может адресовать 64 ГБ физической памяти (вместо 4 ГБ, адресуемых при использовании 32-разрядных таблиц), хотя каждая задача (программа) всё равно может адресовать максимум до 4 ГБ виртуальной памяти[1]

даже в режиме PAE в рамках одного процесса адресация все равно 32х битная. PAE позволяет системе использовать более 4х Гб, но не одному процессу. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
EgoBrain
Дата 7.8.2013, 02:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 23.3.2008
Где: Комната

Репутация: нет
Всего: 2



Что-то я не понял.
Это программная технология? Но как она работает если ограничение на физическом уровне, проц (контроллер памяти) адресует память и количество "захваченных" ячеек зависит от разрядности адресного регистра.
PM MAIL ICQ Skype   Вверх
DarthTon
Дата 7.8.2013, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 7.2.2009

Репутация: нет
Всего: 6



То, что описал Alexeis, это аппаратная реализация PAE; программный механизм опирается в свою очередь на аппаратный, и если его нет, то и адресовать больше 4 ГБ x32 ОС не сможет.
Если действительно интересно, почитайте вики, там неплохо описано http://en.wikipedia.org/wiki/Physical_Address_Extension.
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0888 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.