交易全部,我已经实现了一些功能,并喜欢问一些基本的事情,因为我没有一个在C + +的基础知识。我希望,大家都会友好地告诉我,我可以从你身上学到什么样的好方法。 (拜托,这不是一门功课,我DONOT有任何专家角落找寻我问这个)庞大的数据集内存优化
我做什么;我从文件中读取输入x,y,z点数据(大约3GB数据集),然后为每个点计算一个单一值并存储在一个向量(结果)中。然后,它将在下一个循环中使用。然后,该向量将不再使用,我需要获取该内存,因为它包含巨大的数据集。我认为我可以通过两种方式做到这一点。 (1)通过初始化矢量,稍后擦除它(参见代码-1)。 (2)通过分配动态内存然后解除分配(见代码2)。我听说这种解除分配是无效的,因为解除分配又花费了内存,或者我误解了。
Q1) 我想知道什么是在内存和效率方面的优化方式。
Q2) 另外,我想知道引用函数返回是否给予输出的好方法。 (请看码-3)
代码-1
int main(){
//read input data (my_data)
vector<double) result;
for (vector<Position3D>::iterator it=my_data.begin(); it!=my_data.end(); it++){
// do some stuff and calculate a "double" value (say value)
//using each point coordinate
result.push_back(value);
// do some other stuff
//loop over result and use each value for some other stuff
for (int i=0; i<result.size(); i++){
//do some stuff
}
//result will not be used anymore and thus erase data
result.clear()
代码-2
int main(){
//read input data
vector<double) *result = new vector<double>;
for (vector<Position3D>::iterator it=my_data.begin(); it!=my_data.end(); it++){
// do some stuff and calculate a "double" value (say value)
//using each point coordinate
result->push_back(value);
// do some other stuff
//loop over result and use each value for some other stuff
for (int i=0; i<result->size(); i++){
//do some stuff
}
//de-allocate memory
delete result;
result = 0;
}
code03
vector<Position3D>& vector<Position3D>::ReturnLabel(VoxelGrid grid, int segment) const
{
vector<Position3D> *points_at_grid_cutting = new vector<Position3D>;
vector<Position3D>::iterator point;
for (point=begin(); point!=end(); point++) {
//do some stuff
}
return (*points_at_grid_cutting);
}
另一个想法可能是使用'deque'而不是'vector',因为存储的连续性似乎不是OP的要求。 –
同意。这可能会很快加速建立容器的过程,所有这些'push_back'调用都可以帮助解决这个问题,并且可能有助于系统有3GB可用内存的(不常见)情况,但不能连续分配它,因此不能将其用于矢量。 –
另一种加速所有'push_back'的可能方法是以'results.reserve(my_data.size());' –