#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. На самом деле, связанный список занимает больше памяти