2010-03-31 34 views
23

Tôi có một chương trình thực hiện các cuộc gọi đệ quy 2 tỷ lần và tràn ngăn xếp. Tôi thực hiện các thay đổi, và sau đó nó vẫn cần 40K cuộc gọi đệ quy. Vì vậy, tôi cần một số bộ nhớ ngăn xếp MB. Tôi nghe nói kích thước ngăn xếp mặc định là 1MB. Tôi đã thử tìm kiếm trực tuyến. Một số người nói để đi tài sản -> linker ......... trong studio trực quan, nhưng tôi không thể tìm thấy nó.Làm thế nào để thay đổi kích thước ngăn xếp cho một chương trình .NET?

Có ai biết cách tăng không? Ngoài ra tôi tự hỏi nếu tôi có thể đặt nó ở đâu đó trong chương trình C# của tôi?

P.S. Tôi đang sử dụng winXP 32 bit và winbit 64 bit.

Trả lời

32

Cách dễ nhất để thiết lập kích thước ngăn xếp từ .NET 2.0 và Win XP trở đi là để đẻ trứng một chủ đề mới với ngăn xếp kích thước mà bạn muốn: -

using System.Threading; 

Thread T = new Thread(threadDelegate, stackSizeInBytes); 
T.Start(); 

Để thay đổi kích thước ngăn xếp của toàn bộ chương trình bạn phải sử dụng editbin: -

EDITBIN.EXE /STACK:<stacksize> file.exe 
+2

Đối với những người đi tuyến đường editbin, bạn cần tải xuống bộ công cụ Visual C++ trong trình cài đặt Visual Studio. Bạn cũng có thể đặt nó trong các bước xây dựng bài đăng của mình dưới dạng 'EDITBIN.EXE/STACK: $ (TargetName)' –

+0

@CameronAavik Thêm vào nhận xét của bạn, tôi cần thêm thư mục công cụ SDK vào đường dẫn của mình, khởi động lại Visual Studio để xem thay đổi và sử dụng '$ (TargetPath)' thay vì '$ (TargetName)'. –

10

Rất có thể bạn nên thử sử dụng vòng lặp thay vì đệ quy.

+7

+1, 2 tỷ cuộc gọi đệ quy hơi quá mức. –

+0

Hãy chính xác hơn một chút: Vấn đề không phải là quá nhiều đệ quy * mỗi lần *, hoặc số lần lặp lại (sau khi tất cả, vẫn sẽ có 2 tỷ lần lặp sau khi chuyển đổi thành vòng lặp). Vấn đề thực sự là trình biên dịch có thể không tạo ra các cuộc gọi đuôi; chỉ vì điều đó có sự đệ quy kết hợp với số lần lặp lại cao trở nên có vấn đề. – stakx

16

Không có tùy chọn trình biên dịch để thực hiện. Bạn có thể edit it after the fact using editbin /stack hoặc tạo một chuỗi riêng cho thuật toán của mình và chỉ định kích thước ngăn xếp lớn hơn trong Thread constructor.

Điều đó đang được nói, bạn có thể muốn làm phẳng chức năng đệ quy của bạn ... Nếu bạn đang gặp phải tình trạng tràn bộ đệm, thật khó để biết rằng bất kỳ kích thước ngăn xếp nào sẽ phù hợp trong thời gian dài. Đây chỉ là một giải pháp hỗ trợ băng thông.

0

Tôi biết rằng trong VS bạn có thể đặt kích thước ngăn xếp tùy ý (EDIT: Đối với chương trình C++). Tuy nhiên, tôi khuyên bạn nên sử dụng lệnh gọi đuôi (tức là, trả về MyFunc (args);) sẽ tự động tái chế dung lượng ngăn xếp. Sau đó, bạn sẽ sử dụng một số đối tượng được phân bổ heap để giữ trạng thái.

+0

Nói chung, tôi không nghĩ rằng các trình biên dịch .NET sẽ tối ưu hóa một cuộc gọi đuôi đệ quy. Ít nhất, C# và VB.NET thì không. – user1172763

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