2012-03-02 57 views
9

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?

+0

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ớ. –

+0

Ngoài ra, bạn * là * trên hệ điều hành 64 bit, phải không? –

+0

Có, tôi đang sử dụng các cửa sổ 64 bit –

Trả lời

15

Ma trận có kích thước 60,000 x 60,0003,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.
+0

thực sự, tôi có 20GB! –

+0

Làm thế nào nó không? Thông báo lỗi? Tai nạn? – Mysticial

+0

"Ứ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. –

1

Để 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.

1

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.

+0

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. –

2

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.

+0

yeap, tôi có> 20 GB HDD và 4GB ram –

+0

@Kingfisher 4GB ram? Vì vậy, bạn đang dựa vào trao đổi?!?!? – Mysticial

+0

@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. –

Các vấn đề liên quan