views:

64

answers:

1

I have an application that fetches data from a database and stores it in memory for later use. I've tested this application for around 7000 data rows but when I want to use it for 10000 or more I ran into a StackOverflow exception. This is so weird because I think I should get OutOfMemory, not Stackoverflow if my data is too big.

+2  A: 

You are right of course. Getting a stack overflow in C/C++ code is pretty easy to do:

int _tmain(int argc, _TCHAR* argv[])
{
    char buffer[4 * 1024 * 1024];
    return 0;
}

The 4 to make sure it blows in 64-bit mode as well. But arrays are reference types in managed code. They get allocated on the heap, not the stack. In C# code, you would have to allocate a value type as a local variable to gobble up stack space. And the only value type type that qualifies to get you anywhere with that is a struct. That's hard, you'd have to declare a struct that has a quarter of a million members, give or take. The only possible way to get one of those is a struct that was auto-generated from some kind of tool and a huge dbase scheme.

That just doesn't happen. Surely the problem is located in your dbase provider. Invariably written in C or C++. And doing something nasty like using _alloca() to blow the stack. The "stackalloc" keyword in C#. I'll avoid mentioning the editbin.exe utility with the /stack argument to increase the size of the main thread stack, you shouldn't have to monkey with that.

Talk to your dbase provider provider.

Hans Passant