Tôi đã cố gắng tìm ra lý do tại sao chương trình của tôi tiêu tốn rất nhiều RAM hệ thống. Tôi đang tải một tập tin từ đĩa vào một vectơ của cấu trúc của một số mảng được phân bổ động. Một tệp 16MB kết thúc tiêu thụ 280MB RAM hệ thống theo trình quản lý tác vụ. Các loại trong tập tin chủ yếu là ký tự với một số quần short và một vài dài. Có 331.000 bản ghi trong tệp có chứa trung bình khoảng 5 trường. Tôi đã chuyển đổi vector thành một cấu trúc và làm giảm bộ nhớ còn khoảng 255MB nhưng điều đó vẫn có vẻ rất cao. Với vector chiếm quá nhiều bộ nhớ, chương trình đang hết bộ nhớ nên tôi cần tìm cách để sử dụng bộ nhớ hợp lý hơn.Tại sao chương trình VC++ lưu trữ 5MB dữ liệu tiêu thụ 64MB bộ nhớ hệ thống?
Tôi đã viết một chương trình đơn giản để chỉ cần một công cụ một vector (hoặc mảng) với 1.000.000 char con trỏ. Tôi hy vọng nó sẽ phân bổ 4 + 1 byte cho mỗi 5MB bộ nhớ cần thiết để lưu trữ, nhưng trên thực tế nó đang sử dụng 64MB (phiên bản mảng) hoặc 67MB (phiên bản vectơ). Khi chương trình đầu tiên khởi động nó chỉ tiêu thụ 400K vậy tại sao có thêm 59MB cho mảng hoặc 62MB cho vectơ được phân bổ? Bộ nhớ bổ sung này có vẻ là cho mỗi thùng chứa, vì vậy nếu tôi tạo một size_check2 và sao chép tất cả mọi thứ và chạy nó chương trình sử dụng lên 135MB cho 10MB giá trị của con trỏ và dữ liệu.
Cảm ơn trước,
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");
}
Tôi chưa đọc chi tiết mã của bạn, nhưng xin lưu ý rằng con trỏ cũng chiếm không gian. – slartibartfast
Bạn cũng cần tính đến việc căn chỉnh và sắp xếp cấu trúc dữ liệu. – feathj
@myrkos là chính xác - bốn byte, nếu tôi nhớ chính xác, trên phần cứng thông thường. Định nghĩa lớp học của bạn cũng chiếm không gian. Hãy thử làm một sizeof() của một đối tượng size_check mà bạn thực hiện và nhân số đó với số lượng cá thể bạn tạo và xem điều đó có tạo nên sự khác biệt hay không. –