Có câu trả lời, nhưng thật khó để nói chung mà không biết chi tiết của sự cố.
Tôi giả sử Windows XP 32 bit.
Cố gắng tránh 100s MB bộ nhớ tiếp giáp, nếu bạn không may mắn, một vài dll ngẫu nhiên sẽ tự tải tại các điểm bất tiện thông qua không gian địa chỉ sẵn có của bạn nhanh chóng cắt giảm các vùng rất lớn của bộ nhớ liền kề. Tùy thuộc vào API bạn cần, điều này có thể khá khó ngăn chặn. Nó có thể khá ngạc nhiên như thế nào chỉ phân bổ một vài khối bộ nhớ 400MB ngoài việc sử dụng bộ nhớ 'bình thường' có thể khiến bạn không có nơi nào để phân bổ một khối 'nhỏ' 40MB cuối cùng.
Mặt khác, hãy preallocate khối kích thước hợp lý tại một thời điểm. Của thứ tự 10MB hoặc hơn là một khối thỏa hiệp tốt. Nếu bạn có thể quản lý để phân vùng dữ liệu của bạn thành loại khối kích thước này, bạn sẽ có thể lấp đầy không gian địa chỉ một cách hợp lý một cách hiệu quả.
Nếu bạn vẫn sắp hết dung lượng địa chỉ, bạn sẽ cần phải có khả năng chặn trang trong và ngoài dựa trên một số loại thuật toán lưu vào bộ nhớ cache. Việc chọn đúng khối để trang ra sẽ phụ thuộc rất nhiều vào algortihm xử lý của bạn và sẽ cần phân tích cẩn thận.
Chọn vị trí trang cần thực hiện là một quyết định khác. Bạn có thể quyết định chỉ viết chúng vào các tệp tạm thời. Bạn cũng có thể điều tra API Extenstions Address Windowing của Microsoft. Trong cả hai trường hợp, bạn cần phải cẩn thận trong thiết kế ứng dụng của bạn để làm sạch bất kỳ con trỏ nào trỏ đến thứ gì đó sắp được phân trang ra nếu không thì những điều thực sự xấu (tm) sẽ xảy ra.
Chúc may mắn!
Nguồn
2008-09-29 21:43:32
Tôi nghĩ bạn có thể muốn tránh phân mảnh không chống phân mảnh? –
Đặt cược của tôi là trên C++ - nhưng điều đó là đúng: Câu hỏi không thể được trả lời miễn là "mô thức" cơ bản không được biết .... – Georgi
Cảm ơn, Douglas, tôi đã sửa lỗi đó! –