我正在编写一个从csv文件读取值的应用程序。在逗号存储在向量中的地方,每一行都被拆分。每一行有4个值。然后将每个值存储到另一个向量。csv文件有5.795.857行。因此,在我的结构中,我想存储4*5.795.857值。问题是应用程序崩溃了。正如我所看到的,在调试器中,我大约在405.000行进行压缩。我知道我的电脑有点旧,但我认为它应该能够存储这么多的值。我在Qt5 32位上运行WindowsXP,我有1GB内存。
我对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;
}发布于 2013-05-22 15:20:10
基本上,std::vector由三个元素组成:
容量是矢量当前可以容纳的元素数,它是数组的实际大小(以RAM为单位)。大小是向量中真正有元素的数量。例如,当您创建一个空的vector<int>时,它的大小是0,它的容量是10 (或者其他什么东西,我不知道),并且数组正在消耗10 * sizeof(int)。如果您push_back一个值,那么大小是1,但是容量或数组的实际大小没有变化。
但是,当向量中有10个元素并尝试添加一个元素时,会发生一些事情:实际数组已满(vec.size() == vec.capacity()),因此算法必须扩展该容量:
20 * sizeof(int)字节,当然,您现在可以将20个项加起来,添加一个21项将使算法为40个项分配,而添加第41项将使其分配到80个项。
通常,你并不真正关心这些内部细节。但是,当你向向量中添加大量的项目时,问题就开始出现了。向量增长得越多,新的分配和拷贝就会消耗更多的时间和内存。在您的情况下,我怀疑您的405 001行使算法需要为810 000个元素分配,并从第一个元素复制到第二个元素,并且由于RAM运行非常低,您的操作系统正在磁盘上写入部分内容,这是非常慢的。
您希望数组的初始容量足够大,以减少重新分配的发生。您可以做的是调用reserve方法,并给它一个足够大的数目,以避免过多的分配。然而,我担心您可能没有足够的RAM来实现这个过程,即使是这样。
https://stackoverflow.com/questions/16686760
复制相似问题