我一直在努力弄清楚爲什麼我的程序消耗了太多的系統RAM。我正在從磁盤加載一個文件到幾個動態分配數組的結構向量中。根據任務管理器,一個16MB文件最終會消耗280MB的系統RAM。文件中的類型主要是一些短褲和幾條長褲。該文件中有331,000條記錄平均包含大約5個字段。我將矢量轉換爲結構,並將內存減少到約255MB,但仍然看起來非常高。隨着矢量佔用大量內存,程序內存不足,所以我需要找到一種更合理的內存使用方式。爲什麼存儲5MB數據的VC++程序會佔用64MB系統內存?
我寫了一個簡單的程序來填充一個帶有1,000,000個char指針的向量(或數組)。我希望它爲每個存儲需要5MB內存分配4 + 1字節,但實際上它使用64MB(陣列版本)或67MB(矢量版本)。當程序第一次啓動時,它只消耗了400K,爲什麼還有一個額外的59MB的陣列或62MB的矢量被分配?這額外的內存似乎是爲每個容器,所以如果我創建一個size_check2並複製所有內容並運行它,程序使用了135MB的指針和數據10MB的價值。
由於提前,
size_check.h
#pragma once
#include <vector>
class size_check
{
public:
size_check(void);
~size_check(void);
typedef unsigned long size_type;
void stuff_me(unsigned int howMany);
private:
size_type** package;
// std::vector<size_type*> package;
size_type* me;
};
size_check.cpp
#include "size_check.h"
size_check::size_check(void)
{
}
size_check::~size_check(void)
{
}
void size_check::stuff_me(unsigned int howMany)
{
package = new size_type*[howMany];
for(unsigned int i = 0; i < howMany; ++i)
{
size_type *me = new size_type;
*me = 33;
package[i] = me;
// package.push_back(me);
}
}
的main.cpp 的#include 「size_check.h」
int main(int argc, char * argv[ ])
{
const unsigned int buckets = 20;
const unsigned int size = 50000;
size_check* me[buckets];
for(unsigned int i = 0; i < buckets; ++i)
{
me[i] = new size_check();
me[i]->stuff_me(size);
}
printf("done.\n");
}
我還沒有詳細閱讀你的代碼,但請記住,指針也佔用空間。 – slartibartfast 2011-06-11 02:48:07
您還需要考慮數據結構對齊和填充。 – feathj 2011-06-11 02:52:14
@myrkos是正確的 - 如果我沒有記錯的話,在公共硬件上有四個字節。你的班級定義也需要空間。試着做一個你製作的size_check對象的sizeof(),然後把它乘以你創建的實例的數目,看看它是否不能彌補差異。 – 2011-06-11 02:55:11