2010-07-26 4 views
1

У меня есть приложение, которое извлекает данные из базы данных и сохраняет их в памяти для последующего использования. Я тестировал это приложение примерно для 7000 строк данных, но когда я хочу использовать его для 10000 или более, я столкнулся с исключением StackOverflow. Это настолько странно, что я думаю, что я должен получить OutOfMemory, а не Stackoverflow, если мои данные слишком велики.исключение stackoverflow в нерекурсивном контексте

+4

Можете ли вы разместить код? –

+0

Не могли бы вы опубликовать код и трассировку стека во время исключения? –

+0

+1 за вопрос о переполнении стека при переполнении стека (почтовый индекс!) – Hogan

ответ

2

Вы, конечно, правы. Получение переполнения стека в коде C/C++ довольно легко сделать:

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

4, чтобы убедиться, что он дует в 64-битном режиме, а также. Но массивы являются ссылочными типами в управляемом коде. Они распределяются в куче, а не в стеке. В коде C# вам нужно будет присвоить значение типа в качестве локальной переменной, чтобы сожрать пространство стека. И единственный тип типа значения, который подходит для вас в любом месте, - это структура. Это hard, вам нужно объявить структуру, в которой есть четверть миллиона членов, отдайте или возьмите. Единственный возможный способ получить один из них - это структура, которая была автоматически сгенерирована из какого-то инструмента и огромной схемы базы данных.

Этого просто не бывает. Несомненно, проблема находится в вашем провайдере dbase. Неизменно написан на C или C++. И делать что-то неприятное, как использование _alloca(), чтобы взорвать стек. Ключевое слово «stackalloc» в C#. Я не буду упоминать утилиту editbin.exe с аргументом/stack, чтобы увеличить размер стека основного потока, вам не следует обезьяны с этим.

Обратитесь к поставщику услуг dbase.

Смежные вопросы