交易全部,我已經實現了一些功能,並喜歡問一些基本的事情,因爲我沒有一個在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());' –