【问题标题】:C++. 2d vectors growing too bigC++。 2d 向量变得太大
【发布时间】:2015-12-06 08:30:37
【问题描述】:

我得到了不断增加大小的二维向量(因为它包含所有排列模式)但是当我形成 11 个变量排列时,我的程序将崩溃,因为向量变得太大并且我的 ram 无法承受它,我应该如何解决这个问题 ?我试图将格式输出为文本,但是文本文件变得太大,只有几 GB 并继续增长,这花费了太长时间。

我的笔记本电脑,i7 4700MQ,8GB 内存,Windows 8.1 Pro x64

下面是我用来形成二维向量的代码。

while (next_permutation(route.begin() + 1, route.end())) { 
        //check for every route permutation
        //first store route pattern x inside 1st vector,then will store the next route pattern in another row.
            for (counter = 0; counter < route.size(); counter++) {
                routePattern.push_back(route[counter]);
            }
            routeFormation.push_back(routePattern);
            routePattern.clear();

        }

【问题讨论】:

  • 在速度和空间之间的通常权衡中(很少有相同的类型),你可以继续使用向量并将东西保存在内存中,但是你不能保持为您显然想要的大量数据;或者您可以将所有数据保存到磁盘,然后可以拥有大量数据,但处理速度会比较慢。
  • 将数据包含到磁盘的最佳方法是什么?似乎文本文件不是一个好主意
  • 如果你memory map the file,可以把它当作普通内存,以原生二进制格式存储数据。您可以保留一个法线向量来跟踪每个“行”的大小,这样可以更轻松地在内存映射文件中找到特定行。
  • 您可以使用一个线程写入文件而另一个线程计算排列的线程,这样您将有效地用完时间,同时确保您的 RAM 从一端得到清理.
  • 有 11 个元素,你有 39916800 排列,你必须乘以排列的大小......

标签: c++ memory vector 2d-vector


【解决方案1】:

其实大部分数据最好用dequeue,因为dequeue是分块分配数据而不是一大块(vector保证所有数据都可以像c数组一样访问)

存档可用于减少所需的内存,存档的数据可以存储在内存中或磁盘中。有很多c/c++的归档库,例如

http://nih.at/libzip/

【讨论】:

  • 什么是出队?抱歉,我才看到这个回复。我需要保留所有路线模式,因为稍后我需要知道哪一条是最短路径
  • dequeue 是双端队列:std::dequeue 的使用方式与向量相同,除了通过指向某个元素的指针cplusplus.com/reference/deque/deque 使用 c-array
  • 如果您 p​​ush_back 到没有保留大小的向量,则会启动重新分配。例如,当您向包含 1000 个条目的向量添加条目时,将分配 1001 的内存,将复制 1000 个条目 - 只有在此之后,才能释放前 1000 个条目的内存。分块拆分数据解决了出队中的这个问题
猜你喜欢
  • 2020-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
  • 2020-09-07
  • 1970-01-01
  • 1970-01-01
  • 2018-03-04
相关资源
最近更新 更多