【发布时间】:2015-11-11 20:05:10
【问题描述】:
我正在加载大约 1000 个文件,每个文件代表一个大约 300 万个浮点数的数组。我需要将它们全部放在内存中,因为我需要进行一些涉及所有这些的计算。
在下面的代码中,我已经分解了内存分配和文件读取,因此我可以分别观察每个的速度。我有点惊讶地发现内存分配比文件读取花费的时间长得多。
std::vector<std::vector<float> * > v(matrix_count);
for(int i=0; i < matrix_count; i++) {
v[i] = new std::vector<float>(array_size);
}
for(int i=0; i < matrix_count; i++) {
std::ifstream is(files[i]);
is.read((char*) &((*v[i])[0]), size);
is.close();
}
测量时间,分配循环需要 6.8 秒,而文件加载需要 2.5 秒。从磁盘读取的速度几乎是为其分配空间的 3 倍,这似乎违反直觉。
我可以做些什么来加快内存分配?我尝试分配一个大向量,但由于 bad_malloc 失败了——我猜 10GB 的向量不行。
【问题讨论】:
-
1.自己使用一块连续的内存和映射索引。 2. 使用boost向量实现与避免所有向量元素零初始化的构造函数。
-
没有理由动态分配向量内的向量。也就是说,创建向量并将它们初始化为零是相当昂贵的。相反,将文件内存映射到内存中,无论如何它们似乎类似于浮点数组的内存结构。另外,请检查大小,因为即使分配速度较慢,它也不会比慢速 IO 操作花费更长的时间。
-
这里我倾向于同意 inf,只使用单个块分配。这将是保留空间的最有效的内存和 cpu 方式。还要确保您在具有大量内存的机器上运行。一旦你的工作开始交换,你就会迷失方向(这实际上可以解释为什么向量的创建速度较慢)。如果您真的关心速度配置文件,请使用例如 valgrind 的 callgrind 插件。当你发现为什么你的代码很慢时,你常常会感到惊讶。它往往与您的预期不同。
-
re:分配一大块,我确实提到我尝试过,但是当我尝试分配一个 10GB 向量时,我得到一个 bad_malloc 失败。我不应该遇到这个问题,即矢量应该能够处理这样的大小吗?
-
也许你应该分析一下究竟是什么花了这么长时间。也许这很容易解决。
标签: c++ performance memory memory-management