Gần đây, tôi làm việc trong C++ và tôi phải tạo một array[60.000][60.000]
. Tuy nhiên, tôi không thể tạo mảng này vì nó quá lớn. Tôi đã thử float **array
hoặc thậm chí static float array
nhưng không có gì là tốt. Có ai có ý tưởng không? Cảm ơn sự giúp đỡ của bạn!Tạo mảng quá lớn trong C++, cách giải quyết?
Trả lời
Ma trận có kích thước 60,000 x 60,000
có 3,600,000,000
yếu tố.
Bạn đang sử dụng loại float
để nó trở thành:
60,000 x 60,000 * 4 bytes = 14,400,000,000 bytes ~= 13.4 GB
Bạn thậm chí có nhiều bộ nhớ trong máy tính của bạn?
Lưu ý rằng vấn đề của stack so với heap thậm chí không quan trọng trừ khi bạn có đủ bộ nhớ để bắt đầu.
Dưới đây là danh sách các vấn đề có thể:
- Bạn không có đủ bộ nhớ.
- Nếu ma trận được khai báo trên toàn cầu, bạn sẽ vượt quá kích thước tối đa của nhị phân.
- Nếu ma trận được khai báo là một mảng cục bộ, thì bạn sẽ thổi xếp chồng của bạn.
- Nếu bạn đang biên soạn cho 32-bit, bạn đã vượt quá giới hạn địa chỉ 2GB/4GB.
thực sự, tôi có 20GB! –
Làm thế nào nó không? Thông báo lỗi? Tai nạn? – Mysticial
"Ứng dụng này đã yêu cầu Thời gian chạy để chấm dứt nó theo một cách khác thường." Tôi sử dụng devC và đó là những gì tôi có zzz. –
Để khởi tạo mảng 2D phao mà bạn muốn, bạn sẽ cần:
60000 * 60000 * 4 byte = 14400000000 byte
Đó là khoảng 14GB bộ nhớ. Đó là rất nhiều bộ nhớ. Để thậm chí giữ lý thuyết đó, bạn sẽ cần phải chạy một máy 64bit, chưa kể đến một với khá nhiều RAM được cài đặt.
Hơn nữa, phân bổ bộ nhớ này gần như không bao giờ cần thiết trong hầu hết các trường hợp, bạn có chắc chắn không có tối ưu hóa nào có thể được thực hiện ở đây?
EDIT:
Thông tin mới từ nhận xét của bạn về các câu trả lời khác: Bạn chỉ có bộ nhớ 4GB (RAM). Hệ điều hành của bạn do đó sẽ phải trang ít nhất 9GB trên ổ cứng, trong thực tế có lẽ nhiều hơn. Nhưng bạn cũng chỉ có 20GB dung lượng ổ cứng. Điều này là không đủ để trang tất cả dữ liệu đó, đặc biệt là nếu đĩa bị phân mảnh. Cuối cùng, (tôi có thể sai bởi vì bạn đã không nói rõ ràng) nó là khá có thể là bạn đang chạy một máy 32bit. Điều này không thực sự có khả năng xử lý nhiều hơn 4GB bộ nhớ cùng một lúc.
Phân bổ bộ nhớ trong thời gian chạy - hãy xem xét sử dụng tệp ánh xạ bộ nhớ làm phần đệm. Giống như tất cả mọi người nói, 14 hợp đồng biểu diễn là rất nhiều bộ nhớ. Nhưng nó không phải là không hợp lý để tìm một máy tính với 14GB bộ nhớ, cũng không phải là không hợp lý để trang bộ nhớ khi cần thiết.
Với ma trận có kích thước này, bạn có thể sẽ rất tò mò về hiệu suất truy cập bộ nhớ. Hãy nhớ để xem xét các hạt bộ nhớ cache của kiến trúc mục tiêu của bạn và nếu mục tiêu của bạn có một TLB bạn có thể sử dụng các trang lớn hơn để giảm bớt một số áp lực TLB.Sau đó, một lần nữa, nếu bạn không có đủ bộ nhớ, bạn sẽ chỉ quan tâm đến tốc độ lưu trữ I/O của bạn.
Nếu chưa rõ ràng, bạn sẽ cần kiến trúc hỗ trợ không gian địa chỉ 64 bit để truy cập bộ nhớ này trực tiếp/thuận tiện.
Tệp bộ nhớ được ánh xạ "cắn" vào không gian địa chỉ bộ nhớ ảo của quy trình. Vì vậy, một quá trình 32-bit sẽ không thể truy cập nhiều hơn 2 GB (hoặc 4 GB khi "không gian địa chỉ lớn nhận thức") _at một time_ ngay cả với các tập tin ánh xạ bộ nhớ. Quá trình 64-bit sẽ, nhưng nó cũng sẽ có thể giải quyết trực tiếp nhiều bộ nhớ, mà đánh bại mục đích của việc sử dụng tệp ánh xạ bộ nhớ. OTOH, nếu mục tiêu là chọn lọc tải các tập tin thực tế trên cơ sở khi cần thiết, mà không cần ánh xạ quá nhiều tập tin tại bất kỳ thời điểm nào, thì tệp ánh xạ bộ nhớ là thích hợp. –
Có "60.000" thực sự có nghĩa là "60000" không? Nếu vậy, kích thước của bộ nhớ cần thiết là 60000 * 60000 * sizeof(float)
, khoảng 13,4 GB. Quy trình 32 bit điển hình chỉ giới hạn ở mức 2 GB, vì vậy, rõ ràng lý do tại sao nó không phù hợp.
Mặt khác, tôi không thấy lý do tại sao bạn không thể phù hợp với quy trình 64 bit đó, giả sử máy của bạn có đủ RAM.
yeap, tôi có> 20 GB HDD và 4GB ram –
@Kingfisher 4GB ram? Vì vậy, bạn đang dựa vào trao đổi?!?!? – Mysticial
@Kingfisher - Đó là vấn đề của bạn - bạn đang nhầm lẫn bộ nhớ (RAM) với không gian đĩa cứng, đó là cả hai thứ khác nhau. –
- 1. Có cách giải quyết nào để quá tải toán tử gán trong C# không?
- 2. Mảng nhanh nhất giải quyết
- 3. Giải quyết typedefs trong C và C++
- 4. Giải quyết các thông số trong C#
- 5. Cách tốt nhất để tạo mảng bit lớn trong Lua
- 6. Các cách khác để giải quyết "khởi tạo vòng lặp" trong C#
- 7. Mảng có thể quá lớn không?
- 8. Giải quyết các loại mảng trong thùng chứa Unity (Prism)
- 9. cách giải quyết lỗi này "com.android.internal.telephony không thể được giải quyết thành loại" trong android
- 10. Cách giải quyết lỗi LNK2019
- 11. Giải quyết vấn đề trong C++ với STL
- 12. Điều gì quyết định quá trình mà các phương pháp chưa thực hiện được giải quyết?
- 13. Giải quyết sự nhầm lẫn được tạo ra bởi quá nhiều cách để chạy unittest trong python
- 14. "Không thể giải quyết ..." trong NetBeans 6.7.1, Linux, C++
- 15. Giải quyết địa chỉ IP từ DNS trong C#
- 16. Cách giải quyết GC_concurrent được giải phóng?
- 17. Không thể giải quyết phương thức F # đã bị ghi đè và quá tải từ C#
- 18. Tổ chức giải pháp C# lớn
- 19. C++ - <loại chức năng quá tải chưa được giải quyết>
- 20. Không thể giải quyết TargetName - Silverlight4 C#
- 21. C++ cảnh báo giải quyết istream :: tellg
- 22. cách giải quyết cho GridView.scrollTo()?
- 23. Tạo hình ảnh lớn trong C#
- 24. Cách tạo số ngẫu nhiên lớn C
- 25. Cách giải quyết lỗi java.lang.NullPointerException?
- 26. Tạo thuật toán giải quyết mê cung trong Java
- 27. Chrome: Cách giải quyết lỗi "Kích thước ngăn xếp cuộc gọi tối đa đã vượt quá" trên Math.max.apply (Math, array)
- 28. Cách giải quyết "tràn bảng nội bộ" trong Applescript
- 29. MS giải quyết vấn đề gì khi tạo PowerShell?
Nếu bạn thực sự cần một mảng lớn, tôi khuyên bạn nên xem xét sử dụng tệp ánh xạ bộ nhớ. Hệ điều hành của bạn sẽ chỉ bản đồ trong các trang bạn truy cập nếu bạn không thể phù hợp với toàn bộ điều vào bộ nhớ. –
Ngoài ra, bạn * là * trên hệ điều hành 64 bit, phải không? –
Có, tôi đang sử dụng các cửa sổ 64 bit –