2010-10-15 47 views
17

Tôi đang cố tạo một dải gồm byte s có chiều dài là UInt32.MaxValue. mảng này thực chất là nhỏ (ish) là trong bộ nhớ cơ sở dữ liệu:Độ dài byte tối đa []?

byte[] countryCodes = new byte[UInt32.MaxValue]; 

Trên máy tính của tôi, tuy nhiên, tại thời gian chạy, tôi nhận được một System.OverflowException với "hoạt động số học dẫn đến sự tràn".

Thỏa thuận là gì? Tôi có cần sử dụng khối unsafemalloc không? Làm thế nào tôi sẽ làm điều đó trong C#?

+4

Tôi không biết có quá nhiều quốc gia! – James

Trả lời

24

Việc triển khai hiện tại System.Array sử dụng Int32 cho tất cả các bộ đếm nội bộ của nó vv, do đó số lượng tối đa lý thuyết của các thành phần là Int32.MaxValue.

Ngoài ra còn có giới hạn kích thước tối đa cho mỗi đối tượng 2 GB áp đặt bởi Microsoft CLR.

Một cuộc thảo luận tốt và cách giải quyết ở đây ...

Và một vài liên quan, không hẳn là trùng lặp, các câu hỏi và câu trả lời ở đây ...

1

Tôi sẽ không làm điều này ngay từ đầu. Tại sao bạn muốn đặt tất cả bộ nhớ đó sang một bên cho cơ sở dữ liệu trong bộ nhớ này? Bạn sẽ không muốn một cấu trúc dữ liệu có kích thước tăng lên khi bạn đi cùng (ví dụ: List<int>)? Hoặc (nếu được ưa thích) sử dụng cơ sở dữ liệu trong bộ nhớ như sqlite?

7

Trên .NET 4.5 Độ dài instantiatable tối đa của một mảng byte là: 2147483591 hoặc 56 ít hơn int.MaxValue. Tìm thấy qua:

for (int i = int.MaxValue; i > 0; i--) 
{ 
    try 
    { 
     byte[] b = new byte[i]; 
     Console.Out.WriteLine("MaxValue: " + i); 
     Environment.Exit(0); 
    } 
    catch (Exception ignored) 
    {} 
} 
Các vấn đề liên quan