Я пишу приложение, в котором я читаю значения из файла csv. Каждая строка разделяется, где запятая хранится в векторе. Каждая строка имеет 4 значения. Затем я сохраняю каждое значение другому вектору. Файл csv имеет 5.795.857 строк. Поэтому в моей структуре я хочу хранить значения 4 * 5.795.857. Проблема заключается в том, что приложение подавляет. Как я вижу, с отладчиком я раздавил примерно на линии 405 000. Я знаю, что мой компьютер немного стар, но я думаю, что он должен иметь возможность хранить это количество значений. Я запускаю Qt5 на WindowsXP 32bit, и у меня 1GB RAM.Проблемы с памятью с Qt5
Я новичок в программировании на Qt и C++, но как разработчик Java, когда у меня возникают такие проблемы, я увеличиваю размер кучи. Вы думаете, что это моя проблема? Если да, то как я могу увеличить размер кучи в Qt5?
Это мой код, который читает файл и сохраняет его в структуре данных
std::vector < std::vector < QString> > Server::loadCsvFile(const char* path)
{
vector <QString> temp;
vector <vector <QString> > dataFlow;
string dataString;
QString row;
ifstream dataFile(path);
int stopCounter = 0;
//while((dataFile.good()) && (stopCounter < 1095))
while (dataFile.good())
{
stopCounter++;
getline(dataFile, dataString);
row = QString::fromStdString(dataString);
//cout << "counter: " << stopCounter << "\n";
QStringList rowList = row.split(",");
for( int i=0; i < rowList.size(); i++)
{
temp.push_back(rowList.at(i));
}
dataFlow.push_back(temp);
temp.clear();
rowList.clear();
}
dataFile.close();
dataFlow.pop_back();
return dataFlow;
}
До сих пор я сделал некоторые изменения, чтобы это не исправляет мою проблему, но ничего. Вот как это выглядит мой код знает:
std::vector <QStringList> Server::loadCsvFile2(const char* path)
{
std::vector <QStringList> dataFlow;
QFile file(path);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
throw std::runtime_error("Can't open the file " +
std::string(path));
QTextStream in(&file);
int counter = 0;
while (!in.atEnd())
{
counter++;
dataFlow.emplace_back(in.readLine().split(","));
cout << counter << "\n";
}
return dataFlow;
}
Какова средняя длина (приблизительно) каждой строки вашего CSV-файла? Строки 4 * 5M = 20M - это много данных, если каждая строка содержит около 500 символов, вы потребляете весь свой Gb около 405000-го элемента. – Fabien
Это пример первой строки: 20121215,4000039_14,9,24. Остальная часть линии похожа на эту – salvador
И чем вы их храните? a 'vector'? Имеет ли Qt что-то общее с этой частью кода? –
Fabien