2012-03-17 21 views
6

Tôi đang sử dụng C#, .NET 4.0, 64-bit. Tôi cần lưu trữ trong bộ nhớ 500 triệu "điểm dữ liệu" được sử dụng trong tính toán. Tôi cần phải quyết định xem có nên tạo chúng như là các đối tượng struct hay class hay không. Structs có vẻ nhanh hơn rất nhiều.Giới hạn bộ nhớ ngăn xếp .NET

Có giới hạn bộ nhớ cho ngăn xếp không? Nếu vậy, làm thế nào nó có thể được điều chỉnh.

Việc lưu trữ quá nhiều dữ liệu trên ngăn xếp có ảnh hưởng đến hiệu suất tổng thể của hệ thống không?

(Nhân tiện, tôi biết về giới hạn kích thước đối tượng đơn trong .NET, do đó, nó đang được giải quyết - dữ liệu sẽ được lưu trữ trong nhiều bộ sưu tập).

+1

bạn có chắc là bạn không gây nhầm lẫn với chồng bằng đống không? –

+1

Bạn dựa vào cơ sở nào để giả sử/giả sử rằng cấu trúc "nhanh hơn rất nhiều" so với các lớp học? –

+0

Tôi đoán OP tạo ra mối quan hệ khó khăn giữa phân bổ stack và cấu trúc, điều đó là sai. Đây là những chủ đề hoàn toàn khác nhau, mà * có thể * có liên quan. – Tigran

Trả lời

6

Bạn đang đặt câu hỏi sai. Nếu kích thước ngăn xếp quan trọng, bạn đang làm gì đó sai.

Nếu bạn sử dụng nhiều datapoints, bạn sẽ đặt chúng trong một bộ sưu tập, chẳng hạn như một mảng. Mảng luôn được phân bổ trên heap sau đó. Một mảng các cấu trúc nhúng các cấu trúc riêng lẻ và tạo thành một khối bộ nhớ liên tục. (Nếu bạn có nhiều hơn 2GB, bạn cần một số mảng).

Trong khi đó với các loại tham chiếu, mảng sẽ chỉ chứa các tham chiếu và các đối tượng được phân bổ riêng trên heap. Một phân bổ đống có khoảng 16 byte trên đầu, tham chiếu trong tài khoản mảng khác 8.
Bạn cũng sẽ nhận được vị trí bộ nhớ cache tồi tệ hơn do các số không, và GC phải thực hiện nhiều công việc hơn để thu thập tất cả các tham chiếu đó.

Kết luận của tôi là nếu bạn có nhiều điểm dữ liệu nhỏ, hãy đặt chúng thành cấu trúc và đặt chúng vào một mảng.

1

Bạn có thể sử dụng các lớp cho điểm dữ liệu của bạn. Trong trường hợp này, bộ nhớ sẽ được cấp phát trên heap. Tuy nhiên, nếu bạn đang nói về 500 triệu điểm dữ liệu, và đặc biệt khi bạn đang lập trình trong thế giới .NET với giới hạn bộ nhớ bị giới hạn hơn cho ứng dụng, tôi sẽ khuyến khích sử dụng một số loại cơ sở dữ liệu nhúng, như sqlite, ví dụ. Bằng cách này, bạn sẽ tránh có tất cả các điểm dữ liệu trong bộ nhớ cùng một lúc, nhưng chỉ những điểm bạn cần để tính toán bây giờ.

+0

Theo kinh nghiệm của tôi, nó phổ biến để yêu cầu truy cập nhanh vào lượng lớn dữ liệu mà không cần phí của cơ sở dữ liệu. Và nếu bạn tải tất cả chúng vào bộ nhớ, bạn sẽ nhận được 12GB chi phí chỉ để sử dụng các loại tham chiếu. Không hay. – CodesInChaos

+0

@CodeInChaos: đồng ý. Infact không nạp tất cả chúng vào bộ nhớ, như được đề xuất, nhưng sử dụng một số lớp 'db' để giữ dữ liệu. – Tigran

+1

Thường thì bạn muốn giữ tất cả chúng trong bộ nhớ vì lý do hiệu suất. Ví dụ, tôi thường làm việc với các mô phỏng vật lý, nơi hàng chục GB dữ liệu được tổ chức trong các mảng lớn. – CodesInChaos

4

Bạn sẽ lưu trữ dữ liệu của mình trong mảng và mảng luôn được lưu trữ trên heap. Vì vậy, nó không quan trọng hay không bạn sử dụng cấu trúc hoặc các lớp học để giữ những mảng. Bạn cũng có thể muốn đảm bảo rằng các điểm dữ liệu của bạn là các loại giá trị (ví dụ: cấu trúc) sao cho các mảng của các điểm dữ liệu có thể được phân bổ hiệu quả trong các khối bộ nhớ liền nhau.

Sự khác biệt hiệu suất giữa bộ nhớ heap và bộ nhớ được cấp phát có nhiều khả năng được nhìn thấy với các đối tượng nhỏ được phân bổ và deallocated trong một khoảng thời gian ngắn. Đối với các đối tượng tồn tại lâu dài của kích thước bạn mô tả, tôi mong đợi sẽ không có sự khác biệt về hiệu suất giữa bộ nhớ phân bổ và bộ nhớ heap.

+0

Vấn đề là nếu struct được cấp phát trên heap, nó sẽ mất "lợi ích" của nó (từ điểm hỏi) về phân bổ nhanh. – Tigran

+0

@Tigran Những khác biệt này sẽ không thể thực hiện được khi bạn đã thực hiện một hoạt động trên 500 triệu điểm dữ liệu. –

+2

@Tigran Không phải nếu nó là một phần của mảng. Structs sẽ kết thúc trong một khối bộ nhớ liên tục trong mảng, trong khi các lớp sẽ nhận được một thể hiện mới (với 16 byte liên quan trên đầu) và các indirections bổ sung. – CodesInChaos