首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qt5的内存问题

Qt5的内存问题
EN

Stack Overflow用户
提问于 2013-05-22 08:15:26
回答 1查看 1K关注 0票数 1

我正在编写一个从csv文件读取值的应用程序。在逗号存储在向量中的地方,每一行都被拆分。每一行有4个值。然后将每个值存储到另一个向量。csv文件有5.795.857行。因此,在我的结构中,我想存储4*5.795.857值。问题是应用程序崩溃了。正如我所看到的,在调试器中,我大约在405.000行进行压缩。我知道我的电脑有点旧,但我认为它应该能够存储这么多的值。我在Qt5 32位上运行WindowsXP,我有1GB内存。

我对Qt和c++编程很陌生,但是作为一个java开发人员,当我遇到这样的问题时,我会增加堆的大小。你觉得这是我的问题吗?如果是,如何在Qt5中增加堆大小?

这是我的代码,它读取文件并将其存储在数据结构中。

代码语言:javascript
复制
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;
}

直到现在,我做了一些修改,以看到这解决了我的问题,但什么也没有。这就是我的代码所知道的样子:

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

发布于 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来实现这个过程,即使是这样。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16686760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档