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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 52, средняя оценка - 4.98
nill
8 / 8 / 0
Регистрация: 16.08.2009
Сообщений: 415
07.02.2010, 14:28     Тип данных для очень большого массива #1
Есть массив где больше четырех миллионов элементов

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

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

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

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

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

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

это 4 миллиарда элементов
nill
8 / 8 / 0
Регистрация: 16.08.2009
Сообщений: 415
07.02.2010, 15:02  [ТС]     Тип данных для очень большого массива #4
zim22
novi4ok

А как это сделать? какой код для ваших решений ?
Мне очень нужен пример если не сложно
zim22
depict1
 Аватар для zim22
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
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
07.02.2010, 15:11     Тип данных для очень большого массива #6
Увы, это неверно.
Максимальный теоретически возможный размер вектора для некоторого типа данных возвращает его член-функция max_size(). Однако, реальный размер вектора ограничивается адресным пространством, доступным процессу для размещения пользовательских данных. Так, например, в Win32 размер виртуальный памяти, доступной процессу для размещения пользовательских данных, немногим менее 2 ГБайт (подробности - у мэтра Рихтера). Таким образом, предельно в Win32 можно создать вектор размером около двух миллиардов char или около полумиллиарда int.
nill
8 / 8 / 0
Регистрация: 16.08.2009
Сообщений: 415
07.02.2010, 16:05  [ТС]     Тип данных для очень большого массива #7
zim22,
vi это имя массива ?

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

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

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

CheshireCat,
есть одна книжка рихтера но он очень уж запутано пишет
если можно то хотелось бы какой то пример кода то о чем вы пишете
zim22
depict1
 Аватар для zim22
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
8 / 8 / 0
Регистрация: 16.08.2009
Сообщений: 415
07.02.2010, 16:35  [ТС]     Тип данных для очень большого массива #9
zim22,
так а двумерный массив как записать ?

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

но выдает ошибку
HIMen
 Аватар для HIMen
4104 / 1353 / 39
Регистрация: 12.04.2009
Сообщений: 2,346
07.02.2010, 16:46     Тип данных для очень большого массива #10
Цитата Сообщение от nill Посмотреть сообщение
Есть массив где больше четырех миллионов элементов
В стек такой не поместится, выделяй память динамически.
zim22
depict1
 Аватар для zim22
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
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
08.02.2010, 07:15     Тип данных для очень большого массива #12
Цитата Сообщение от nill Посмотреть сообщение
Есть массив где больше четырех миллионов элементов
Есть диапазон индексов, а есть число элементов. То есть возможен, например, такой вариант: индексы бывают от 0 до 1070189, но из них реально используется 10% или даже меньше. Такие массивы можно хранить в форме разреженных. Определение:
разреженным называется массив, у которого номинальное число элементов больше числа элементов реально присутствующих в данном массиве.
Если массив разрежен, то он может иметь и триллион номинальных элементов, но если использоваться будет, например, тысяча, то хранится в памяти тоже будет тысяча (одна миллиардная всего массива). Сколько элементов тебе реально нужны? Проанализируй возможность применения разреженного массива в виде объекта специального класса.
nill
8 / 8 / 0
Регистрация: 16.08.2009
Сообщений: 415
08.02.2010, 07:21  [ТС]     Тип данных для очень большого массива #13
zim22
большое спасибо код работает

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

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

если можно то нужен пример инициализации разряженного Двумерного массива
insideone
Модератор
Автор FAQ
 Аватар для insideone
3620 / 898 / 47
Регистрация: 10.01.2010
Сообщений: 2,422
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
8 / 8 / 0
Регистрация: 16.08.2009
Сообщений: 415
08.02.2010, 15:43  [ТС]     Тип данных для очень большого массива #15
zim22,
тестирую вариант с vector
как то он очень медленно работает даже если есть только одна строчка
std::vector<std::vector<int> > massiv(1070190, std::vector<int>(4));
и никаких действий с массивом не происходит

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

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


insideone,
А как начсет скорости если создавать доп массивы это наверно еще медленее чем с vector ?
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
08.02.2010, 15:58     Тип данных для очень большого массива #16
такое количество памяти выделяется динамически без проблем:

C++
1
int *pI = (int*)malloc (1070190*sizeof(int)*4);
insideone
Модератор
Автор FAQ
 Аватар для insideone
3620 / 898 / 47
Регистрация: 10.01.2010
Сообщений: 2,422
08.02.2010, 16:12     Тип данных для очень большого массива #17
Цитата Сообщение от nill Посмотреть сообщение
А как начсет скорости если создавать доп массивы это наверно еще медленее чем с vector ?
К сожалению не работал с vector. Смысл моего предложения - если вы не знаете сколько у вас данных всего и просто заполняете массив от 0 до n (где n то огромное число которое вам нужно) это позволит вам сделать такое с минимальными издержками. Выделение памяти для нового массива не думаю что очень тормозный процесс. При записи\чтении расчитывается сколько массивов надо проскочить, т.е. забрать \ записать данные стоит от их длинны. Например есть 1000 элемент который надо записать а у вас блоки по 600, то 1000 элемент лежит во втором блоке и значит нужно выполнить всего 1 операцию на переключение и 1 операцию вычитания (1000-600 = 400 (блок из которого берем во втором массиве)). Я думаю это мелочь При этом можно организовать массив любой мерности, достаточно написать простую функцию которая преобразует n мерные координаты в линейные как я описывал выше
nill
8 / 8 / 0
Регистрация: 16.08.2009
Сообщений: 415
08.02.2010, 17:34  [ТС]     Тип данных для очень большого массива #18
novi4ok,
а где здесь имя массива ?

попробовал
C++
1
int *massiv = (int*)malloc (1070190*sizeof(int)*4);
когда хочу обратиться к массиву программа не компилируеться
error C2109: subscript requires array or pointer type

insideone,
понятно а без использования класса это можно сделать ?
программа у меня очень простая и ООП мне там не нужно

Добавлено через 1 час 18 минут
novi4ok,

попробовал записать так
C++
1
2
int *massiv = (int*)malloc (1070190*sizeof(int)*4);
massiv[0]=1;
код работает но мне то нужен двумерный массив

а обращение к двумерному массиву
C++
1
massiv[0][0]=1;
выдает ошибку о которой я написал
error C2109: subscript requires array or pointer type
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
08.02.2010, 17:37     Тип данных для очень большого массива #19
вот так примерно:
C++
1
2
3
4
5
6
7
8
9
10
11
#define NUMBER_ROWS 1070190
#define ROW_LENGTH  4
 
    int *pIntArray = (int*)malloc (NUMBER_ROWS*sizeof(int)*ROW_LENGTH);
 
    int index_of_column = 1;
    int index_of_row = 0;
    
    *(pIntArray+(index_of_row*ROW_LENGTH)+index_of_column) = index_of_column * index_of_row;
 
    int intElement = *(pIntArray+(index_of_row*ROW_LENGTH)+index_of_column);
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.02.2010, 17:46     Тип данных для очень большого массива
Еще ссылки по теме:

Целочисленный тип данных для 10^50 C++
Cохранение очень большого массива в текстовый файл C++
Обработка большого массива данных на C++ C++

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

Или воспользуйтесь поиском по форуму:
nill
8 / 8 / 0
Регистрация: 16.08.2009
Сообщений: 415
08.02.2010, 17:46  [ТС]     Тип данных для очень большого массива #20
novi4ok,
вопрос все тот же
как присвоить значение массиву?
скажем элементу [0][0]

C++
1
pIntArray[0][0]=1;
ошибка
error C2109: subscript requires array or pointer type


как и предыдущий пример все это работает только для одномерного массива
C++
1
pIntArray[0]=1;
работает но мне то нужен двумерный массив
Yandex
Объявления
08.02.2010, 17:46     Тип данных для очень большого массива
Ответ Создать тему
Опции темы

Текущее время: 02:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru