Bối cảnh: Tôi đang viết một chương trình C++ làm việc với số lượng lớn dữ liệu địa lý và muốn tải các khối lớn để xử lý tại một lần duy nhất. Tôi bị ràng buộc làm việc với một ứng dụng được biên dịch cho các máy 32 bit. Máy tôi đang thử nghiệm đang chạy một hệ điều hành 64 bit (Windows 7) và có 6 gig ram. Sử dụng MS VS 2008.Bạn có thể phân bổ bộ nhớ bao nhiêu bộ nhớ?
Tôi có đoạn mã sau:
byte* pTempBuffer2[3];
try
{
//size_t nBufSize = nBandBytes*m_nBandCount;
pTempBuffer2[0] = new byte[nBandBytes];
pTempBuffer2[1] = new byte[nBandBytes];
pTempBuffer2[2] = new byte[nBandBytes];
}
catch (std::bad_alloc)
{
// If we didn't get the memory just don't buffer and we will get data one
// piece at a time.
return;
}
Tôi đã hy vọng rằng tôi sẽ có thể cấp phát bộ nhớ cho đến khi ứng dụng đạt đến giới hạn 4 GB 32 bit địa chỉ. Tuy nhiên, khi nBandBytes là 466,560,000 thì lệnh ném mới std :: bad_alloc trong lần thử thứ hai. Ở giai đoạn này, giá trị bộ nhớ (làm việc) cho quá trình này là 665,232 K Vì vậy, tôi dường như không thể có được một bộ nhớ được phân bổ.
Đã có một số đề cập đến giới hạn 2 gig cho các ứng dụng trong Windows 32 bit có thể được mở rộng đến 3 gig với khóa chuyển đổi/3 GB cho win32. Đây là lời khuyên tốt trong môi trường đó, nhưng không liên quan đến trường hợp này.
Bạn có thể cấp bộ nhớ bao nhiêu trong hệ điều hành 64 bit với ứng dụng 32 bit?
Tôi đã tìm thấy tài liệu tham khảo này trên web: "Nếu bạn đang chạy dưới dạng ứng dụng 32 bit trên hệ điều hành 64 bit thì bạn sẽ nhận được tất cả không gian địa chỉ 4G và tất cả có thể được hỗ trợ bởi bộ nhớ vật lý (nếu bạn có RAM) ngay cả khi bạn không sử dụng các con trỏ 64 bit. " từ blog: http://blogs.msdn.com/ricom/archive/2009/06/10/visual-studio-why-is-there-no-64-bit-version.aspx – Bill
Trên máy 32 bit của tôi, tôi có thể phân bổ 466.560.000 × 3 byte trong thử nghiệm đơn giản. Dường như bộ nhớ quá trình đã bị phân mảnh tại điểm phân bổ trong trường hợp của bạn. –
Tôi gặp khó khăn khi chọn câu trả lời để đánh dấu đúng vào câu hỏi này. Tôi tin rằng câu trả lời là phức tạp và phụ thuộc vào nhiều yếu tố. Các tệp ánh xạ bộ nhớ là một câu trả lời hay, nhưng nguyên nhân gốc rễ của vấn đề này dường như là phân mảnh bộ nhớ. bke1 chỉ ra các công cụ tốt để xem bộ nhớ, và nhiều người đã nói về phân mảnh bộ nhớ, nhưng tôi chọn câu trả lời đầu tiên đã nêu rõ vấn đề và đưa ra giới hạn cứng (4 Gig dưới 64 bit và cờ phải.) – Bill