- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试遍历一棵树,以便访问 4x4 滑动拼图的所有可能状态。我写的算法最初是递归的,但由于(显然)非常深的树,这被证明是不可能的。它崩溃并报告了段错误。然后我决定重写算法以迭代地完成它的工作,据我所知,它工作得很好。然而,一段时间后,由于交换,它开始大幅减速。我做了一些计算,但无法弄清楚所有这些内存使用量来自哪里......
代码贴在下面,但这里是重要的功能:
std::stack<char, std::vector<char>> stack
std::map<unsigned long long, int> distanceTable
假设 stack
的内存占用与它包含的元素数量成正比,并假设 map
相同(其中一个元素是 pair<unsigned long long, int>
),我打印出预期的内存占用量:
cout << (stack.size() * sizeof(char) +
distanceTable.size() * sizeof(pair<unsigned long long, int>))/(1<<20) << "MB\n";
并将输出与 top
的输出进行比较.当我自己的程序报告大约 500MB 时,top
报告说它使用了我所有内存的一半以上 (4GB)。这是我的推理无法解释的因素 4。我在这里缺少什么?
代码:
#include <iostream>
#include <map>
#include <stack>
#include <vector>
#include <sstream>
#include "slider.h"
using namespace std;
typedef Slider<4> Slider4;
typedef Slider4::Move Move;
typedef map<unsigned long long, int> Map;
typedef stack<char, std::vector<char>> Stack;
Move const moves[] = {Slider4::N, Slider4::S, Slider4::E, Slider4::W};
Move const opposite[] = {Slider4::S, Slider4::N, Slider4::W, Slider4::E};
int const moveIdx[] = {0, 1, 2, 3};
int const oppositeIdx[] = {1, 0, 3, 2};
Map generateDistanceTable()
{
// non-recursive tree-walker to generate the distance-table
Map distanceTable;
Stack stack;
Slider4 slider;
unsigned long long depth = 1;
stack.push(-1);
distanceTable[slider.hash()]= depth;
while (depth != 0)
{
cout << (stack.size() * sizeof(char) +
distanceTable.size() * sizeof(pair<unsigned long long, int>))/(1ULL<<20) << "MB\n";
int currentMove = stack.top() + 1;
// find next move
while (currentMove != 4)
{
// Try the move
if (!slider.move(moves[currentMove]))
{
++currentMove;
continue;
}
// Check the current state of the puzzle
auto &d = distanceTable[slider.hash()];
if (d != 0)
{ // already encountered this state -> move back
int undoMove = oppositeIdx[currentMove];
slider.moveUnsafe(moves[undoMove]);
++currentMove; // try next move
continue;
}
stack.push(currentMove);
d = ++depth;
currentMove = 0;
}
if (currentMove == 4)
{
int undoMove = oppositeIdx[stack.top()];
slider.moveUnsafe(moves[undoMove]);
--depth;
stack.pop();
}
}
}
int main()
{
Map table = generateDistanceTable();
}
最佳答案
首先,std::map
特别低效内存使用。您插入的每个值都将放在一个单独的节点,除了值之外,通常包含三个指针和一些附加信息(MS 中的 2 char
执行)。此外,每个节点通常分配分开,所以分配器所需的额外开销必须被添加。在 32 位系统上,总开销为至少 20 个字节;在 64 位系统上,40。
至于 std::vector
(它是你的 std::stack
的基础),它是好多了,但是如果你不使用 reserve
来预分配,它会不时重新分配,通常将容量乘以 1.5 或 2。这意味着它可能最终占用比必要更多的内存。 (还,根据分配模式,系统可能不会能够有效地重用期间释放的内存重新分配。)
不过,通常更喜欢使用 std::vector,保存在使用 std::lower_bound
而不是 std::map
进行排序。
最后,如果您事先确切知道有多少条目vector 将具有或可以建立一些合理的上限,您可以使用 reserve
进行预分配。这避免了任何风险尺寸加倍。
关于c++ - 使用 std::stack 和 std::map 内存使用率意外高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21381113/
我们有一个 SQL 服务器,其中包含大约 40 个不同的数据库(每个数据库大约 1-5GB)。该服务器是8核2.3G CPU和32Gigs RAM。 27Gig 固定到 SQL Server。 CPU
我通过创建一个简单的循环并在数组中添加元素来测试 Java 8 并行流 API 的性能。 与非并行相比,我获得了巨大的性能提升。 但是当我检查我的任务管理器时,我看到了一个不受控制的 CPU 使用率,
我在使用 JFX 应用程序时遇到了一些问题。在我的本地开发系统(Linux)上,我的应用程序的 CPU 使用率约为 0-2%。当我在客户 Windows 虚拟机系统上安装并运行我的应用程序时,CPU
我在 unix 上工作。我想知道进程当前的 cpu 使用情况。我知道 ps 给出了在进程启动之前使用的 cpu 平均值 - 这不是当前使用情况。 有没有办法从 top 命令只打印 cpu 而无需 10
我尝试对许多文件进行哈希处理,但它没有使用满 CPU 能力。它只消耗25%。我测试将繁重的进程移动到线程中。但仍然没有什么不同。我来自 nodejs 使用 sharp 库。有同样的任务。它消耗所有的C
有没有办法在 CentOS 中获取 CPU 使用率?我需要解析这些信息并将其从 Perl 脚本中绘制出来,因此它最好是一个简单的工具,可以打印出一个单一的输出。 最佳答案 更简单,看/proc/loa
早上好。 目前我正在 Ubuntu 服务器 11.10 中运行 Java Web 应用程序。对于我的 Java 应用程序,我使用的是 apache、tomcat 和 mysql。 在过去的几周里,我的
我想做的事 我有一个计算密集型 OCaml 应用程序,我希望它在后台运行而不影响正常的计算机使用。我想为用户提供两个选项: (1) 应用程序仅在 CPU 使用率几乎为 0% 时运行; (2) 应用程序
我使用Couchdb创建了一个私有(private)NPM镜像,但我发现beam.smp将我的 CPU 使用率保持在 100%,有没有办法降低它,比如 50%? 非常感谢你。 最佳答案 您不能直接限制
我正在 docker 容器内构建一个项目,在创建容器时没有任何资源限制。当我监控它时,我看到了不同的 CPU 使用率结果。 来自 ctop 来自 Grafana(全节点导出器图表) 来自 cAdvis
我需要在 Web 开发编码 session 期间收集有关 Firefox CPU 使用率的数据,我想知道是否可以监视特定 firefox 插件的 CPU 使用率。 现在我正在使用 windows 的
R 是单线程的。 使用 R,如何检查 Windows 和 Linux 中有多少内核/线程正在运行 R? (或运行了多少卢比) 使用 R,如何检查 Windows 和 Linux 中运行 R 的每个内核
我正在尝试像示例中那样测试 Kubernetes HPA here kubectl run php-apache --image=gcr.io/google_containers/hpa-exampl
在我们的办公室,我们有一个开发服务器:Win 2k8 server R2 - Coldfusion 9(.0.0) - MySQL 5 ... 几乎每天早上上类时,我都会发现服务器的 CPU 为 50
我有一组 cpu 消耗执行,每个执行都在低优先级的线程中运行。这些线程将在一个进程(如 IIS)中运行,该进程具有许多我不想减慢它们速度的其他线程。我想计算所有其他线程的 cpu 使用率,如果它大于
我是 azure 云的新手,我已经部署了我的第一个辅助角色。 在我的本地系统中需要 30 分钟才能完成的过程在 azure 辅助角色上需要 1 个多小时。 为了查找问题,我已访问辅助角色的远程桌面。我
这是我的测试 boost::tribool 示例: #include #include "boost/logic/tribool.hpp" int main() { boost::logic::tr
我正在使用 docker 远程 API 来检索正在运行的容器的统计信息。对于 CPU 使用情况,我得到的例子是: "cpu_stats": { "cpu_usage": { "to
我是 azure 云的新手,我已经部署了我的第一个辅助角色。 在我的本地系统中需要 30 分钟才能完成的过程在 azure 辅助角色上需要 1 个多小时。 为了查找问题,我已访问辅助角色的远程桌面。我
我知道意外的无限循环通常会导致 CPU 使用率较高。但是,我不太明白为什么。谁能给我解释一下吗? 最佳答案 CPU 在执行该循环(永远不会结束)时无法执行任何其他操作。即使您使用的是抢占式多任务系统(
我是一名优秀的程序员,十分优秀!