Theo sau từ một số previous question relating to heap usage restrictions, tôi đang tìm một lớp C++ chuẩn tốt để xử lý các mảng dữ liệu lớn theo cách vừa hiệu quả vừa hiệu quả về bộ nhớ. Tôi đã được phân bổ mảng bằng cách sử dụng một malloc duy nhất/HealAlloc nhưng sau nhiều trys bằng cách sử dụng các cuộc gọi khác nhau, tiếp tục rơi hôi của đống phân mảnh. Vì vậy, kết luận tôi đã đến, ngoài việc chuyển sang 64 bit, là sử dụng một cơ chế cho phép tôi có một mảng lớn bao trùm nhiều mảnh bộ nhớ nhỏ hơn. Tôi không muốn một phân bổ cho mỗi phần tử vì đó là bộ nhớ rất kém hiệu quả, vì vậy kế hoạch là viết một lớp ghi đè toán tử [] và chọn một phần tử thích hợp dựa trên chỉ mục. Đã có một lớp học phong nha ra khỏi đó để làm điều này, hay tôi tốt hơn lăn của riêng tôi?Lớp mảng C++ tốt để xử lý các mảng dữ liệu lớn một cách hiệu quả và nhanh chóng?
Từ hiểu biết của tôi và một số googling, quy trình Windows 32 bit về mặt lý thuyết có thể có địa chỉ tối đa 2GB. Bây giờ giả sử tôi đã cài đặt 2GB, và nhiều quy trình và dịch vụ khác đang hogging khoảng 400MB, bạn nghĩ chương trình của tôi có thể hợp lý như thế nào để nhận được từ heap?
Tôi hiện đang sử dụng các hương vị khác nhau của Visual C++.
Chỉnh sửa Theo bài đăng của Poita, tôi đã thử một số std :: deque, sử dụng kiểm tra sau trên VS2008;
#include <deque>
using namespace std;
struct V
{
double data[11];
};
struct T
{
long data[8];
};
void dequeTest()
{
deque<V> VQ;
deque<T> TQ;
V defV;
T defT;
VQ.resize(4000000,defV);
TQ.resize(8000000,defT);
}
Tổng bộ nhớ cho dữ liệu trên đi ra ở 608MB, tôi có sử dụng thẳng malloc hoặc HeapAlloc và mất < 1 giây. Việc thay đổi kích thước deque mất 950MB ban đầu, và sau đó từ từ bắt đầu giảm trở lại. 15 phút sau, dequeTest() kết thúc, chỉ sử dụng 6MB bộ nhớ hiển thị cho quá trình mà có thể là nhiều hơn để làm với thời gian chạy. Tôi cũng đã cố gắng tạo ra các deque bằng cách sử dụng các tùy chọn push khác nhau, nhưng hiệu suất rất tệ, tôi phải thoát ra sớm. Tôi có thể có thể cung cấp một phân bổ tốt hơn so với defualt để có được một phản ứng tốt hơn nhiều, nhưng trên khuôn mặt của nó deque không phải là lớp học cho công việc này. Lưu ý điều này cũng có thể liên quan đến việc thực hiện MS VS2008 deque, như có vẻ là rất nhiều trong lớp này là rất thực hiện phụ thuộc khi nói đến hiệu suất.
Thời gian để viết lớp mảng lớn của riêng tôi, tôi nghĩ.
Chỉnh sửa thứ hai: Phân bổ số tiền nhỏ hơn mang lại 1.875GB ngay lập tức bằng cách sử dụng như sau;
#define TenMB 1024*1024*10
void SmallerAllocs()
{
size_t Total = 0;
LPVOID p[200];
for (int i = 0; i < 200; i++)
{
p[i] = malloc(TenMB);
if (p[i])
Total += TenMB; else
break;
}
CString Msg;
Msg.Format("Allocated %0.3lfGB",Total/(1024.0*1024.0*1024.0));
AfxMessageBox(Msg,MB_OK);
}
cuối cùng chỉnh sửa tôi đã quyết định chấp nhận bài Poita và các ý kiến khác nhau sau đó, không phải vì tôi sẽ sử dụng lớp deque trực tiếp, nhưng nhiều hơn cho mảng như một cỗ bài khái niệm trong nhận xét tiếp theo. Điều này nên đơn giản để thực hiện với O (1) truy cập phần tử ngẫu nhiên, dựa trên một số phần tử cố định cho mỗi khối, đó là những gì tôi cần. Cảm ơn tất cả vì phản hồi!
Tôi hy vọng không có "hương vị" nào trong số đó là VC6.0 –
Trong khi tôi vẫn còn VC6.0 và sử dụng nó cho một số thứ, không phải bất cứ thứ gì xảy ra ở gần giai đoạn phát hành. Chủ yếu là VS2008, một số VS2003, và một số EVC + + 4.0 đó là lý do tại sao tôi cũng duy trì một VC6.0. –
Chương trình cửa sổ 32 bit có thể phân bổ hơn 2GB bộ nhớ, bạn không thể ánh xạ tất cả cùng một lúc. - http://blogs.msdn.com/oldnewthing/archive/2004/08/10/211890.aspx – Bill