'Система. OutOfMemoryException' был брошен, когда существует все еще много свободной памяти

Я соглашаюсь с Заправка для соуса Бочонка .

Эта статья должна получить Вас на правильном пути:

Одна вещь отметить, кластерные индексы должны иметь уникальный ключ (столбец идентификационных данных, который я рекомендовал бы) как первый столбец. В основном это помогает Вашим данным вставить в конце индекса и не вызвать много диска IO и Расщеплений страницы.

, Во-вторых, при создании других индексов на данных и они создаются умно, они будут снова использованы.

, например, предполагают, что Вы ищете таблицу на трех столбцах

состояние, графство, zip.

  • Вы иногда ищете по состоянию только.
  • Вы иногда ищете по состоянию и графству.
  • Вы часто ищете по состоянию, графству, zip.

Тогда индекс с состоянием, графством, zip. будет использоваться во всех трех из этих поисков.

, Если Вы ищете одной только zip довольно много тогда, вышеупомянутый индекс не будет использоваться (SQL Server так или иначе), поскольку zip является третьей частью того индекса, и оптимизатор запросов не будет рассматривать что индекс как полезный.

Вы могли тогда создать индекс на одной только Zip, который будет использоваться в этом экземпляре.

я предполагаю ответ, который Вы ищете, то, что он зависит от Вашего где пункты Ваших часто используемых запросов и также Ваш by's группы.

статья поможет много.:-)

85
задан John Saunders 24 December 2012 в 23:30
поделиться

8 ответов

Вы можете прочитать следующее: «« Недостаточно памяти »не относится к физической памяти » Эрика Липперта.

Короче говоря, и очень упрощенно, «Недостаточно памяти» на самом деле не означает, что объем доступной памяти слишком мал. Наиболее частая причина заключается в том, что в текущем адресном пространстве нет непрерывной части памяти, достаточно большой для обслуживания желаемого распределения. Если у вас есть 100 блоков, каждый размером 4 МБ, это не поможет вам, когда вам понадобится один блок размером 5 МБ.

Ключевые моменты:

  • хранилище данных, которое мы называем «памятью процесса», на мой взгляд, является лучшим визуализируется как массивный файл на диске .
  • ОЗУ можно рассматривать просто как оптимизацию производительности
  • Общий объем виртуальной памяти, потребляемой вашей программой, на самом деле не очень важен для ее производительности
  • «исчерпание ОЗУ» редко приводит к ошибке «нехватка памяти» . Вместо ошибки это приводит к снижению производительности, потому что внезапно становится актуальной полная стоимость того факта, что хранилище фактически находится на диске.
130
ответ дан 24 November 2019 в 08:14
поделиться

Увеличьте ограничение процесса Windows до 3 ГБ. (через boot.ini или диспетчер загрузки Vista)

-2
ответ дан 24 November 2019 в 08:14
поделиться

Ну, у меня аналогичная проблема с большим набором данных, и попытка заставить приложение использовать такое количество данных на самом деле не подходит вариант. Лучший совет, который я могу вам дать, - это обрабатывать данные небольшими порциями, если это возможно. Поскольку при работе с таким большим объемом данных проблема рано или поздно вернется. Кроме того, вы не можете знать конфигурацию каждой машины, на которой будет запускаться ваше приложение, поэтому всегда существует риск, что исключение произойдет на другом компьютере.

0
ответ дан 24 November 2019 в 08:14
поделиться

32-битные окна имеют ограничение памяти процесса 2 ГБ. Опция загрузки / 3GB, о которой говорили другие, сделает эти 3 ГБ, а для использования ядра ОС останется всего 1 ГБ. На самом деле, если вы хотите без проблем использовать более 2 ГБ, вам потребуется 64-битная ОС. Это также решает проблему, заключающуюся в том, что хотя у вас может быть 4 ГБ физической ОЗУ, адресное пространство, необходимое для видеокарты, может сделать непригодным для использования значительную часть этой памяти - обычно около 500 МБ.

1
ответ дан 24 November 2019 в 08:14
поделиться

Не могли бы вы попробовать использовать итератор вместо того, чтобы выделять массивный массив? Они выполняются с задержкой, то есть значения генерируются только по запросу в инструкции foreach; вы не должны исчерпывать память таким образом:

private static IEnumerable<double> MakeRandomNumbers(int numberOfRandomNumbers) 
{
    for (int i = 0; i < numberOfRandomNumbers; i++)
    {
        yield return randomGenerator.GetAnotherRandomNumber();
    }
}


...

// Hooray, we won't run out of memory!
foreach(var number in MakeRandomNumbers(int.MaxValue))
{
    Console.WriteLine(number);
}

Вышеупомянутое будет генерировать столько случайных чисел, сколько вы хотите, но генерировать их только по запросу с помощью оператора foreach. Таким образом, у вас не закончится память.

В качестве альтернативы, если вам нужно собрать их все в одном месте, храните их в файле, а не в памяти.

1
ответ дан 24 November 2019 в 08:14
поделиться

Я бы не советовал использовать параметр загрузки Windows / 3GB. Помимо всего прочего (это излишне делать это для одного приложения с плохим поведением, и это, вероятно, все равно не решит вашу проблему), это может вызвать большую нестабильность.

Многие драйверы Windows не работают. протестировано с этой опцией, поэтому многие из них предполагают, что указатели пользовательского режима всегда указывают на нижние 2 ГБ адресного пространства. Это означает, что они могут ужасно сломаться с /3GB.[12102 impression Однако Windows обычно ограничивает 32-разрядный процесс адресным пространством 2 ГБ. Но это не значит, что вы должны ожидать, что сможете выделить 2 ГБ!

Адресное пространство уже завалено всеми видами выделенных данных. Есть стек и все загруженные сборки, статические переменные и так далее. Нет никакой гарантии, что где-либо будет 800 МБ непрерывной нераспределенной памяти.

Выделение фрагментов по 400 МБ, вероятно, будет лучше. Или 4 фрагмента по 200 МБ. В фрагментированном пространстве памяти гораздо легче найти место для небольших выделений.

В любом случае, если вы все равно собираетесь развернуть это на машине 12 ГБ, вам нужно будет запустить это как 64-разрядное приложение, которое должно решить все проблемы.

5
ответ дан 24 November 2019 в 08:14
поделиться

У вас нет непрерывного блока памяти для выделения 762 МБ, ваша память фрагментирована, и распределитель не может найти достаточно большое отверстие для выделения необходимой памяти.

  1. Вы можете попробовать работать с / 3GB (как предлагали другие)
  2. Или переключиться на 64-битную ОС.
  3. Или изменить алгоритм так, чтобы ему не требовался большой кусок памяти. возможно выделить несколько меньших (относительно) блоков памяти.
25
ответ дан 24 November 2019 в 08:14
поделиться

Если вам нужны такие большие структуры, возможно, вы могли бы использовать файлы с отображением памяти. Эта статья может оказаться полезной: http://www.codeproject.com/KB/recipes/MemoryMappedGenericArray.aspx

LP, Деян

2
ответ дан 24 November 2019 в 08:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: