Проблемы при создании огромной матрицы

#c

#c

Вопрос:

Я пытаюсь создать своего рода таблицу со случайными символами и записать их в файл, но у меня проблема. Проблема появляется, когда я хочу создать огромные таблицы. Например, для таблицы с 10 строками x 5 столбцами все идеально, но для таблицы с 1.000.000 строками и 100 столбцами у меня есть ошибки. У вас есть какие-либо идеи, как я мог бы решить эту проблему???

Я прикрепил вам созданный мной код:

 #include<iostream>
#include<fstream>
#include<stdio.h>
#include<string>
#include<ctime>
#include<sstream>

using namespace std;

int main()
{
    int rows, columns, rowsMax, columnsMax; 
    int element1;
    char word[10];

    cout<<"Write the number of rows of your table: ";
    cin>>rowsMax;

    cout<<"Write the number of columns of your table: ";
    cin>>columnsMax;

    string matriz[100000][5]; // Here I write the number of row and columns that must be the same than the numbers introduced as input

    string table ("Table1");

    ofstream myfile (table);
    if(myfile.is_open())
    srand(1);
    for(rows=0;rows<rowsMax;rows  )
    {
        for(columns=0;columns<columnsMax;columns  )
        {
            element1 = rand() % 100000   1;

            int len = rand () % 4   4;
            word [len] = 0;
            while (len) word [--len] = 'A'   rand () % 58;

            myfile<<element1<<word;
            myfile<<"|";

            std::stringstream ss;
            ss<<element1;

            string mat;
            mat  =ss.str();
            mat  =word;
            matriz[rows][columns]= mat;
        }
        myfile<<endl;

    }
    myfile.close();

    system("pause");
    return 0;

}
  

Заранее спасибо за всю вашу помощь!

Комментарии:

1. Сколько оперативной памяти у вашего компьютера?

2. Какие ошибки вы получаете?

Ответ №1:

Вы разместили массив в стеке, который обычно имеет очень ограниченный размер. Для Windows по умолчанию это около 1 МБ.

Вместо этого вы можете разместить массив в куче.

Комментарии:

1. Для какого компилятора? Я имею в виду, это одинаково для всех компиляторов?

2. @Acme, размер стека по умолчанию обычно определяется операционной системой, но вы можете переопределить его, используя параметры компоновщика. Проверьте это, например: Размер стека потоков в Windows

Ответ №2:

Таблица с 1.000.000 строками и 100 столбцами:

 string matriz[1000000][100]; 
  

означает, что размер строки 1000000* 100 * > 1 МБ, что огромно по сравнению с размером стека потоков по умолчанию.
Даже если вы выделите матрицу с помощью кучи, размер будет примерно более 2 ГБ (виртуальная память процесса по умолчанию).

Возможно, механизм отображения памяти помог бы!

Ответ №3:

1000000 строк и 100 столбцов — это ужасно много данных (100 миллионов чего угодно займут много места). Возможно, у вас недостаточно памяти?

Заполнены ли каждая строка и столбец? Если нет, то вы могли бы что-то сохранить, используя разреженное матричное представление.

Ответ №4:

Вы создаете свою матрицу в стеке, который имеет ограниченный размер. Попробуйте разместить ее в куче, используя «new» или вектор строк.

Ответ №5:

Если вы работаете с огромной матрицей, вам следует использовать связанный список. пример

Комментарии:

1. На самом деле, связанный список занимает больше памяти