index
просто описывает, какой файл обслуживать по умолчанию. Вам нужно ключевое слово root
:
location /docs {
root /path/to/another/index;
index filename.html;
}
Теперь веб-сервер будет обслуживать /path/to/another/index/filename.html
при доступе к маршруту / документам /.
Помимо того, что вы Это, вероятно, лучше всего делать с помощью API-интерфейсов XML вместо строк или StringBuilder. Я сомневаюсь, что ошибка, которую вы видите, связана с конкатенацией строк. Возможно, переключение на StringBuilder просто замаскировало ошибку или изящно обошло ее, но я сомневаюсь, что использование строк действительно было причиной.
Чтобы ответить на ваш вопрос: String contatenation in C# (and .NET in general) is "safe", but doing it in a tight loop as you describe is likely to cause severe memory pressure and put strain on the garbage collector.
I would hazard a guess that the errors you speak of were related to resource exhaustion of some sort, but it would be helpful if you could provide more detail — for example, did you receive an exception? Did the application terminate abnormally?
Background:
string a = "aaa";
string b = "bbb";
string c = "ccc";
// ...
string temp1 = "aaabbb";
string temp2 = "aaabbbccc";
string temp3 = "aaabbbcccddd";
string temp4 = "aaabbbcccdddeee";
string temp5 = "aaabbbcccdddeeefff";
string temp6 = "aaabbbcccdddeeefffggg";
// ...
Хотя все эти неявные временные переменные имеют право на сборку мусора почти сразу, они все равно должны быть распределены. При выполнении конкатенации в узком цикле это будет сильно напрягать сборщик мусора и, если вообще ничего, заставит ваш код работать очень медленно. Я видел влияние на производительность этой первой руки, и оно становится по-настоящему драматичным, когда ваша конкатенированная строка становится больше.
Рекомендуется всегда использовать StringBuilder
, если вы выполняете несколько строк. конкатенации. StringBuilder
использует изменяемый буфер для уменьшения количества выделений, необходимых для построения вашей строки.
Рекомендуется всегда использовать StringBuilder
, если вы выполняете несколько строк. конкатенации. StringBuilder
использует изменяемый буфер для уменьшения количества выделений, необходимых для построения вашей строки.
Рекомендуется всегда использовать StringBuilder
, если вы выполняете несколько строк. конкатенации. StringBuilder
использует изменяемый буфер для уменьшения количества выделений, необходимых для построения вашей строки.
Конкатенация строк безопасна, хотя и требует больше памяти, чем использование StringBuilder, если используется большое количество строк в цикле. А в крайних случаях у вас может не хватить памяти.
Это почти наверняка ошибка в вашем коде.
Возможно, вы связываетесь с очень большим количеством строк. Или, может быть, это что-то совершенно другое.
Я бы вернулся к отладке без каких-либо предварительных представлений о первопричине - если у вас все еще есть проблемы, попробуйте уменьшить его до минимума, необходимого для воспроизведения проблемы и публикации кода.
Сколько времени займет версия конкатенации и версия компоновщика строк? Возможно, ваше соединение с БД закрыто. Если вы делаете много конкатенации, я бы пошел с StringBuilder, поскольку это немного более эффективно.
string.Concat (string [])
- самый быстрый способ объединения строк. Он убивает StringBuilder
в производительности при использовании в циклах, особенно если вы создаете StringBuilder
в каждой итерации.
Есть множество ссылок, если вы Google "формат строки c # против stringbuilder" или что-то в этом роде.
http://www.codeproject.com/KB/cs/StringBuilder_vs_String.aspx дает вам представление о времени. Здесь string.Join выигрывает тест конкатенации, но я верю, что это потому, что string.Concat (string, string)
используется вместо перегруженной версии, которая принимает массив.
Если вы посмотрите на код MSIL, который генерируется различными методами, вы увидите, что происходит под капотом.
Одной из причин может быть то, что строки являются неизменяемыми в .Net, поэтому, когда вы выполняете какую-либо операцию, например конкатенацию, вы фактически создаете новую строку.
Другая возможная причина - длина строки это int, поэтому максимально возможная длина равна Int32.MaxValue или 2 147 483 647.
В любом случае StringBuilder лучше, чем "string1 + string2" для этого типа операции. Хотя использование встроенных возможностей XML было бы еще лучше.
Вот мой выстрел в темноте ...
Строки в .NET (не в строителях) входят в внутренний пул строк. Это в основном область, управляемая CLR для совместного использования строк для повышения производительности. Здесь должен быть какой-то предел, хотя я понятия не имею, что это за предел. Я полагаю, что все ваши конкатенации - это попадание в потолок струнного пула. Так что SQL говорит да, у меня есть значение для вас, но он нигде не может его поместить, поэтому вы получите исключение.
Быстрая и простая проверка состояла бы в nGen вашей сборке и в поиске ошибки. После nGen'ing ваше приложение больше не будет использовать пул.
Если это не удастся, я бы связался с Microsoft, чтобы попытаться получить некоторые подробности. Я думаю, что моя идея звучит правдоподобно, но я понятия не имею, почему она работает в режиме отладки. Возможно, в режиме отладки строки не интернированы. Я тоже не эксперт.
При объединении строк я всегда использую StringBuilder. Он разработан для этого и более эффективен, чем просто использование "string1 + string2".