Я соглашаюсь с Заправка для соуса Бочонка .
Эта статья должна получить Вас на правильном пути:
Одна вещь отметить, кластерные индексы должны иметь уникальный ключ (столбец идентификационных данных, который я рекомендовал бы) как первый столбец. В основном это помогает Вашим данным вставить в конце индекса и не вызвать много диска IO и Расщеплений страницы.
, Во-вторых, при создании других индексов на данных и они создаются умно, они будут снова использованы.
, например, предполагают, что Вы ищете таблицу на трех столбцах
состояние, графство, zip.
Тогда индекс с состоянием, графством, zip. будет использоваться во всех трех из этих поисков.
, Если Вы ищете одной только zip довольно много тогда, вышеупомянутый индекс не будет использоваться (SQL Server так или иначе), поскольку zip является третьей частью того индекса, и оптимизатор запросов не будет рассматривать что индекс как полезный.
Вы могли тогда создать индекс на одной только Zip, который будет использоваться в этом экземпляре.
я предполагаю ответ, который Вы ищете, то, что он зависит от Вашего где пункты Ваших часто используемых запросов и также Ваш by's группы.
статья поможет много.:-)
Вы можете прочитать следующее: «« Недостаточно памяти »не относится к физической памяти » Эрика Липперта.
Короче говоря, и очень упрощенно, «Недостаточно памяти» на самом деле не означает, что объем доступной памяти слишком мал. Наиболее частая причина заключается в том, что в текущем адресном пространстве нет непрерывной части памяти, достаточно большой для обслуживания желаемого распределения. Если у вас есть 100 блоков, каждый размером 4 МБ, это не поможет вам, когда вам понадобится один блок размером 5 МБ.
Ключевые моменты:
Увеличьте ограничение процесса Windows до 3 ГБ. (через boot.ini или диспетчер загрузки Vista)
Ну, у меня аналогичная проблема с большим набором данных, и попытка заставить приложение использовать такое количество данных на самом деле не подходит вариант. Лучший совет, который я могу вам дать, - это обрабатывать данные небольшими порциями, если это возможно. Поскольку при работе с таким большим объемом данных проблема рано или поздно вернется. Кроме того, вы не можете знать конфигурацию каждой машины, на которой будет запускаться ваше приложение, поэтому всегда существует риск, что исключение произойдет на другом компьютере.
32-битные окна имеют ограничение памяти процесса 2 ГБ. Опция загрузки / 3GB, о которой говорили другие, сделает эти 3 ГБ, а для использования ядра ОС останется всего 1 ГБ. На самом деле, если вы хотите без проблем использовать более 2 ГБ, вам потребуется 64-битная ОС. Это также решает проблему, заключающуюся в том, что хотя у вас может быть 4 ГБ физической ОЗУ, адресное пространство, необходимое для видеокарты, может сделать непригодным для использования значительную часть этой памяти - обычно около 500 МБ.
Не могли бы вы попробовать использовать итератор вместо того, чтобы выделять массивный массив? Они выполняются с задержкой, то есть значения генерируются только по запросу в инструкции 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. Таким образом, у вас не закончится память.
В качестве альтернативы, если вам нужно собрать их все в одном месте, храните их в файле, а не в памяти.
Я бы не советовал использовать параметр загрузки Windows / 3GB. Помимо всего прочего (это излишне делать это для одного приложения с плохим поведением, и это, вероятно, все равно не решит вашу проблему), это может вызвать большую нестабильность.
Многие драйверы Windows не работают. протестировано с этой опцией, поэтому многие из них предполагают, что указатели пользовательского режима всегда указывают на нижние 2 ГБ адресного пространства. Это означает, что они могут ужасно сломаться с /3GB.[12102 impression Однако Windows обычно ограничивает 32-разрядный процесс адресным пространством 2 ГБ. Но это не значит, что вы должны ожидать, что сможете выделить 2 ГБ!
Адресное пространство уже завалено всеми видами выделенных данных. Есть стек и все загруженные сборки, статические переменные и так далее. Нет никакой гарантии, что где-либо будет 800 МБ непрерывной нераспределенной памяти.
Выделение фрагментов по 400 МБ, вероятно, будет лучше. Или 4 фрагмента по 200 МБ. В фрагментированном пространстве памяти гораздо легче найти место для небольших выделений.
В любом случае, если вы все равно собираетесь развернуть это на машине 12 ГБ, вам нужно будет запустить это как 64-разрядное приложение, которое должно решить все проблемы.
У вас нет непрерывного блока памяти для выделения 762 МБ, ваша память фрагментирована, и распределитель не может найти достаточно большое отверстие для выделения необходимой памяти.
Если вам нужны такие большие структуры, возможно, вы могли бы использовать файлы с отображением памяти. Эта статья может оказаться полезной: http://www.codeproject.com/KB/recipes/MemoryMappedGenericArray.aspx
LP, Деян