Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 52, средняя оценка - 4.98
nill
9 / 9 / 0
Регистрация: 16.08.2009
Сообщений: 417
#1

Тип данных для очень большого массива - C++

07.02.2010, 14:28. Просмотров 7243. Ответов 24
Метки нет (Все метки)

Есть массив где больше четырех миллионов элементов

C++
1
int massiv[1070190][4]={0};
когда так пишу программа компилируется нормально

но при выполнении выдает ошибку
в коде программы в массив даже ничего не записываю но все равно прога вылетает

пробовал писать так

C++
1
double massiv[1070190][4]={0};
вылетает так же

можно как то использовать такой массив ?

если нет то какой максимальный размер массива можно использовать ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.02.2010, 14:28
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Тип данных для очень большого массива (C++):

Cохранение очень большого массива в текстовый файл - C++
Помогите пожалуйста. Мне требуется сохранить карту в своей игре в текстовый файл. Класс карты: class cMap { public: ...

Обработка большого массива данных на C++ - C++
Суть проблемы. На работе, дали задание проработать 1 большой файл (вывести графики результата анализа и т.д.). Файл: двоичный. ~ 71 Мб ...

Сортировка очень большого файла. - C++
вопрос таков: есть очень большой файл, его нужно отсортировать. Так как файл большой его нужно извлекать по частям. Как это можно...

что лучще использовать для большого массива тескста - C++
Добрый день. Столкнулся с проблемой со следующей проблемой мне надо выводить таблицу в текстовом формате где 10 столбцов и много...

Класс очень большого числа. Перегрузка operator++ - C++
Число хранится в массиве. Не могу сделать перегрузку ++. Помогите. byte* massiv; massiv = new byte; Big* operator++() {...

Мне очень нужна программа для игры gta samp 0.3c для взлома базы данных - C++
Мне очень нужна программа для игры gta samp 0.3c для взлома базы данных

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
07.02.2010, 14:47 #2
или размер стека увеличить, или память массиву аллокировать динамически.
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
07.02.2010, 14:50 #3
на 32 разрядной машине можно создать std::vector c таким максимальным количеством элементов по каждой размерности: 4294967295

это 4 миллиарда элементов
nill
9 / 9 / 0
Регистрация: 16.08.2009
Сообщений: 417
07.02.2010, 15:02  [ТС] #4
zim22
novi4ok

А как это сделать? какой код для ваших решений ?
Мне очень нужен пример если не сложно
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
07.02.2010, 15:03 #5
Цитата Сообщение от nill Посмотреть сообщение
А как это сделать? какой код для ваших решений ?
C++
1
2
3
4
5
#include <vector>
int main() {
  // выбери такой размер, чтобы массив в оперативке поместился :)
  std::vector<char> vi(1114967295); // около гига скушать у ОС
}
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,368
07.02.2010, 15:11 #6
Увы, это неверно.
Максимальный теоретически возможный размер вектора для некоторого типа данных возвращает его член-функция max_size(). Однако, реальный размер вектора ограничивается адресным пространством, доступным процессу для размещения пользовательских данных. Так, например, в Win32 размер виртуальный памяти, доступной процессу для размещения пользовательских данных, немногим менее 2 ГБайт (подробности - у мэтра Рихтера). Таким образом, предельно в Win32 можно создать вектор размером около двух миллиардов char или около полумиллиарда int.
nill
9 / 9 / 0
Регистрация: 16.08.2009
Сообщений: 417
07.02.2010, 16:05  [ТС] #7
zim22,
vi это имя массива ?

строка
std::vector<char> vi(1114967295);

инициализирует массив или просто позволяет инициализировать большой массив с типом char ?

мне к примеру нужен тип int его поставить вместо char ?

CheshireCat,
есть одна книжка рихтера но он очень уж запутано пишет
если можно то хотелось бы какой то пример кода то о чем вы пишете
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
07.02.2010, 16:12 #8
Цитата Сообщение от nill Посмотреть сообщение
vi это имя массива ?
да
Цитата Сообщение от nill Посмотреть сообщение
инициализирует массив или просто позволяет инициализировать большой массив с типом char ?
создаёт массив с количеством элементов, указанных в скобках. не обязательно сразу указывать размер вектора, т.к. вектор - это динамическая структура и может увеличиваться по мере необходимости.
Цитата Сообщение от nill Посмотреть сообщение
мне к примеру нужен тип int его поставить вместо char ?
C++
1
std::vector<int> vi;
Цитата Сообщение от nill Посмотреть сообщение
если можно то хотелось бы какой то пример кода то о чем вы пишете
пример кода не нужен. можно экспериментальным путём установить, какой объём памяти процесс может запросить у ОС. достаточно попытаться выделить нужный объём - если будет слишком много - программа аварийно завершится / бросится исключение. Ориентироваться на то, что можно будет выделить 2 гига оперативки.
nill
9 / 9 / 0
Регистрация: 16.08.2009
Сообщений: 417
07.02.2010, 16:35  [ТС] #9
zim22,
так а двумерный массив как записать ?

попробовал
C++
1
std::vector<int> massiv(1000000)(4);

но выдает ошибку
HIMen
4129 / 1378 / 39
Регистрация: 12.04.2009
Сообщений: 2,346
07.02.2010, 16:46 #10
Цитата Сообщение от nill Посмотреть сообщение
Есть массив где больше четырех миллионов элементов
В стек такой не поместится, выделяй память динамически.
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
07.02.2010, 18:37 #11
Цитата Сообщение от nill Посмотреть сообщение
так а двумерный массив как записать ?
массив 100 на 100
C++
1
std::vector<std::vector<int> > vi(100, std::vector<int>(100));
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
08.02.2010, 07:15 #12
Цитата Сообщение от nill Посмотреть сообщение
Есть массив где больше четырех миллионов элементов
Есть диапазон индексов, а есть число элементов. То есть возможен, например, такой вариант: индексы бывают от 0 до 1070189, но из них реально используется 10% или даже меньше. Такие массивы можно хранить в форме разреженных. Определение:
разреженным называется массив, у которого номинальное число элементов больше числа элементов реально присутствующих в данном массиве.
Если массив разрежен, то он может иметь и триллион номинальных элементов, но если использоваться будет, например, тысяча, то хранится в памяти тоже будет тысяча (одна миллиардная всего массива). Сколько элементов тебе реально нужны? Проанализируй возможность применения разреженного массива в виде объекта специального класса.
nill
9 / 9 / 0
Регистрация: 16.08.2009
Сообщений: 417
08.02.2010, 07:21  [ТС] #13
zim22
большое спасибо код работает

Добавлено через 2 минуты
taras atavin,
ну вообще конечно массив используеться не на 100%

где то от 10 до 80%

если можно то нужен пример инициализации разряженного Двумерного массива
insideone
Модератор
Автор FAQ
3638 / 916 / 49
Регистрация: 10.01.2010
Сообщений: 2,469
08.02.2010, 13:49 #14
Может написать свой класс подобно такому:
C++
1
2
3
4
5
6
class Array{
    site_t Offset;
    DBType data[BLOCK_SIZE];
    DBType operator [] (size_t key);
    Array* Next;
};
если запрашивается данные data[x] где x > BLOCK_SIZE то выделяется новый Array и записывается указатель на него, и берется попытка взять данные из него. При этом новый Array знает что данные берутся с поправкой на Offset, т.е. реальный индекс будет не x а x-BLOCK_SIZE

Не знаю для каких целей требуется такие огромные массивы, но нужно не забывать про базы данных...
И ещё... двумерный массив это тот же одномерный массив же по сути, по крайне мере в памяти все идет в линию. Так что Array[10][20] при том что мы берем A[1][1] это тоже самое что A[200] и мы берем A[21]. Можно сделать пересчеты по обращению и все
nill
9 / 9 / 0
Регистрация: 16.08.2009
Сообщений: 417
08.02.2010, 15:43  [ТС] #15
zim22,
тестирую вариант с vector
как то он очень медленно работает даже если есть только одна строчка
std::vector<std::vector<int> > massiv(1070190, std::vector<int>(4));
и никаких действий с массивом не происходит

программа работает на 20сек медленнее

если записывать данные то тормозит еще сильнее
это мне не очень подходит


insideone,
А как начсет скорости если создавать доп массивы это наверно еще медленее чем с vector ?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.02.2010, 15:43
Привет! Вот еще темы с ответами:

Пользовательский тип данных для C - C++
Помогите пожалуйста создать пользовательский тип данных для языка C, так как мне не хватает обычных....

Целочисленный тип данных для 10^50 - C++
Существует ли в C++ целочисленный тип данных, который вмещает 10^50?

тип данных для двоичного числа - C++
подскажите пожалуйста у меня есть двоичные числа какой тип данных нужен для них? ну всмысле я эти числа сам беру из файла и когда потом...

Тип данных для размера файла - C++
warning C4244: 'initializing' : conversion from 'std::streamoff' to 'int', possible loss of data . Как это устранить? Код: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
08.02.2010, 15:43
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru