Tôi phải tạo một mảng đôi khá lớn 12000 x 55000. Thật không may, tôi nhận được một ngoại lệ bộ nhớ. Tôi đã từng phát triển trong Java và có thể thay đổi các thiết lập bộ nhớ. Điều này có thể với C# hoặc là nó chỉ là không thể? Tôi đang sử dụng VS 2008.OutOfMemoryException khi khai báo mảng lớn
Trả lời
Mỗi double
là 8 byte, vì vậy bạn đang cố gắng phân bổ một mảng duy nhất với chỉ hơn 5 GB. CLR có giới hạn cho mỗi đối tượng khoảng 2GB IIRC, ngay cả đối với CLR 64 bit. Nói cách khác, nó không phải là tổng số bộ nhớ có sẵn đó là vấn đề (mặc dù rõ ràng bạn sẽ có vấn đề nếu bạn không có đủ bộ nhớ), nhưng kích thước cho mỗi đối tượng.
Tôi đề nghị bạn chia thành các mảng nhỏ hơn, có lẽ đằng sau mặt tiền của một số mô tả. Tôi không tin rằng có bất kỳ cách nào để giải quyết giới hạn đó cho một mảng đơn lẻ.
EDIT: Bạn thể đi cho một mảng của mảng - aka một mảng lởm chởm:
double[][] array = new double[12000][];
for (int i = 0; i < array.Length; i++)
{
array[i] = new double[55000];
}
rằng có thể chấp nhận được đối với bạn?
(Bạn không thể sử dụng một mảng hình chữ nhật (double[,]
) như rằng sẽ có cùng một vấn đề cho mỗi đối tượng kích thước.)
Hoặc bạn đã hết bộ nhớ (đóng một số chương trình) hoặc bạn đang đạt đến giới hạn phân bổ bộ nhớ (khoảng 2Gb), bộ nhớ này cần phải là khối liền kề. Bạn có thể sử dụng một máy 64bit trong trường hợp bạn sẽ có nhiều bộ nhớ hơn hoặc tôi nghĩ rằng bạn có thể làm cho ứng dụng nhận biết địa chỉ lớn (googling sẽ cho bạn biết cách thực hiện điều này nếu có thể trong trường hợp này).
Hãy tin rằng bạn thêm nút chuyển/3 GB vào tệp Boot.ini để nhận biết địa chỉ lớn.
Vì bạn không thể tạo các đối tượng lớn hơn 2GB bạn có thể thử sử dụng MemoryMappedFile để làm việc với bộ nhớ của kích thước cần thiết.
var data = MemoryMappedFile.CreateNew("big data", 12000L * 55000L);
var view = data.CreateViewAccessor();
var rnd = new Random();
for (var i = 0L; i < 12000L; ++i)
{
for (var j = 0L; j < 55000L; ++j)
{
var input = rnd.NextDouble();
view.Write<double>(i * 55000L + j, ref input);
}
}
Cung cấp tổng bộ nhớ của bạn là đủ, bạn có thể ngăn Out of ngoại lệ bộ nhớ kết quả từ LOH phân mảnh bằng cách tạo ra một loạt các mảng nhỏ hơn, và gói chúng trong một đơn IList<T>
, hoặc một số giao diện lập chỉ mục khác.
Dưới đây là một liên kết trong đó mô tả nó:
BigArray<T>, getting around the 2GB array size limit
Điểm Uy Tín: this post (C# chunked array).
- 1. OutOfMemoryException khi gửi tệp lớn 500MB bằng FileStream ASPNET
- 2. OutOfMemoryException khi tạo tệp ZIP lớn bằng System.IO.Packaging
- 3. Khai báo các mảng lớn cục bộ trong C
- 4. Bắt một tràn ngoại lệ stack khi khai báo một mảng lớn
- 5. Java - Khai báo các mảng
- 6. Khai báo mảng Mảng Byte trong Java
- 7. C Khai báo mảng char *
- 8. OutOfMemoryException khi tôi đọc 500MB FileStream
- 9. Cú pháp khai báo mảng C# so với cú pháp khai báo mảng C++
- 10. Khai báo mảng chuỗi lạ Cú pháp
- 11. Khai báo một mảng byte trong VB.NET
- 12. Lập trình C, tại sao khai báo mảng lớn này tạo ra lỗi phân đoạn?
- 13. Định dạng khai báo mảng liên kết
- 14. Khai báo mảng C++ trong tiêu đề
- 15. Khai báo và gán mảng C?
- 16. Khai báo một mảng có kích thước được khai báo là extern const
- 17. thú vị OutOfMemoryException với StringBuilder
- 18. NET OutOfMemoryException trên XMLSerializer.Serialize
- 19. Khai báo kích thước mảng với biến không đổi
- 20. Gỡ lỗi outofmemoryexception
- 21. Worksheet.Name gây OutOfMemoryException
- 22. Làm thế nào để tránh OutOfMemoryException khi chạy Hadoop?
- 23. Ứng dụng (lớn) của tôi ném ra một OutOfMemoryException, bây giờ là gì?
- 24. Java Enums: Phương thức triển khai sau khi khai báo?
- 25. Khi nào tôi phải khai báo session_start() ;?
- 26. Làm thế nào để khai báo và sử dụng mảng lớn 1 tỷ số nguyên trong C?
- 27. Có thể khởi tạo một mảng sau khi khai báo trong C?
- 28. Tôi nên làm gì về lỗi nội bộ khi tôi khai báo "mảng T" chung chung?
- 29. Cách nào tốt nhất để thực hiện theo khi khai báo một mảng trong Javascript?
- 30. khai báo một mảng const int trong C++
A * khá * mảng lớn? :) – Groo
Tôi khuyên bạn nên xem xét cấu trúc dữ liệu "ngoài bộ nhớ chính" (tức là cơ sở dữ liệu). Tại sao bạn phải lưu trữ một mảng lớn như vậy? – bitxwise
Tôi đã cười khúc khích với lựa chọn từ "khá". –