Исключение системы из памяти при использовании String.Join [duplicate]

Чтобы определить, почему код PHP не работает в коде JavaScript , нам нужно понять, что такое клиентский и серверный язык и как они работают.

Серверные языки (PHP и т. д.) : они извлекают записи из баз данных, поддерживают состояние через HTTP-соединение без состояния и выполняют много вещи, требующие безопасности. Они находятся на сервере, эти программы никогда не имеют своего исходного кода для пользователя

Image from wikipedia_http://en.wikipedia.org/wiki/File:Scheme_dynamic_page_en.svg [/g16] image attr

Хотя с другой стороны Клиентский язык на стороне клиента (например, JavaScript) находится в браузере и запускается в браузере, Сценарии на стороне клиента обычно относятся к классу компьютерных программ в Интернете, которые выполняются на стороне клиента, в веб-браузере пользователя, а не на стороне сервера .

JavaScript отображается пользователю и может быть легко изменен, поэтому для обеспечения безопасности мы не должны полагаться на JavaScript.

Итак, когда вы делаете запрос HTTP на сервере, чем сервер, сначала внимательно читает файл PHP, чтобы узнать, есть ли какие-либо задачи, которые необходимо выполнить, и отправлять ответ на клиентскую сторону и снова, как @deceze сказал * Как только PHP закончил вывод ответа, сценарий заканчивается, и на сервере ничего не произойдет, пока не появится новый запрос HTTP . *

Graphical representation [/g17]

Источник изображения

Итак, что мне делать, если мне нужно вызвать PHP? Это зависит от того, как вам это нужно: либо перезагружая страницу, либо используя вызов AJAX.

  1. Вы можете выполнить перезагрузку страницы и отправить запрос HTTP
  2. вы можете сделать вызов AJAX с помощью JavaScript, и это не требует перезагрузки страницы

Хорошо Чтение:

  1. Википедия:
  2. Википедия: скрипты на стороне клиента
  3. Мадара Учиха: разница между клиентской стороной и программированием на стороне сервера

199
задан McKenzieG1 26 September 2008 в 17:14
поделиться

4 ответа

Теоретический предел может составлять 2,147,483,647, но практический предел нигде не близок. Поскольку ни один объект в .NET-программе не может превышать 2 ГБ, а тип строки использует unicode (два байта для каждого символа), лучшее, что вы могли бы сделать, это 1 073 741 823, но вы вряд ли сможете выделить это на 32-битная машина.

Это одна из тех ситуаций, где [" Если вам нужно спросить, возможно, вы что-то не так сделали. "].

288
ответ дан Sae1962 28 August 2018 в 08:50
поделиться
  • 1
    Это правильный ответ. Вероятнее всего, вы исчерпаете память, прежде чем сможете выделить достаточно, чтобы исчерпать длину строки. При новой загрузке вы могли бы вывести выделение 2 ГБ (с символами 1 М), как указано здесь, но это все. – Stephen Deken 26 September 2008 в 18:30
  • 2
    Предполагая, что ваш «ни один объект не может превышать 2 ГБ», утверждение является точным, это теоретический предел, а также практический. Ограничением на длину строки будет суммарный размер объекта, а не емкость поля Length. – McKenzieG1 26 September 2008 в 18:37
  • 3
    Если кому-то интересно точное значение, на моей 64-битной машине это 1 073 741 791 (1024 · 1024 · 1024 - 33) символов. См. Также мой вопрос о точном максимальном размере byte[] . – svick 7 January 2013 в 23:15
  • 4
    Я схожу с ума по поводу ответов, которые содержат краткое, но подробное объяснение. – Mikayil Abdullayev 10 December 2013 в 09:00
  • 5
    Существует возможность позволить объектам .NET 4.5 (и более поздних версий) быть более 2 ГБ на 64-битных машинах. Проверьте здесь – Anderson Matos 5 October 2015 в 14:22

Строки не ограничены целым числом, как принято считать.

Ограничения памяти в стороне, строки не могут иметь более 230 (1 077 741 824) символов, поскольку ограничение на 2 ГБ накладывается Microsoft CLR (Common Language Runtime).

Надеюсь, это может измениться в будущем.

6
ответ дан Knickerless-Noggins 28 August 2018 в 08:50
поделиться

200 мегабайт ... в этот момент ваше приложение превращается в виртуальную остановку, имеет около установленную память, и o / s начинает действовать так, как вам нужно будет перезагрузиться.

static void Main(string[] args)
{
    string s = "hello world";
    for(;;)
    {
        s = s + s.Substring(0, s.Length/10);
        Console.WriteLine(s.Length);
    }
}

12
13
14
15
16
17
18
...
158905664
174796230
192275853
211503438
2
ответ дан loudej 28 August 2018 в 08:50
поделиться
  • 1
    Я не уверен, что поведение, которое вы получили от создания только одной действительно большой строки, такое же, как и то, что вы видите, выделив кучу из них и объединившись. – Casey 19 February 2016 в 20:56

Поскольку String.Length является целым числом (это псевдоним для Int32), его размер ограничен символами Int32.MaxValue unicode. ; -)

65
ответ дан Sae1962 28 August 2018 в 08:50
поделиться
  • 1
    Применение двоичного поиска здесь, вероятно, поможет вам найти этот ответ намного быстрее ... – Mario 12 July 2010 в 22:08
  • 2
    +1 для использования тестового ответа. – Anonymous Type 4 January 2011 в 01:46
  • 3
    Также стоит отметить, что StringBuilder позволяет установить начальный размер. Полезно, если вы знаете, что вы собираетесь использовать 10 000 000 записей раньше времени, что позволит вам игнорировать некоторые из них. – Kyle Baran 29 August 2014 в 16:53
  • 4
    @ m.edmondson: На самом деле я не уверен. Массив для экземпляров имеет LongLength, а поток использует long как длину. Хотя это правильный ответ, это точный способ измерения этого. – Willem Van Onsem 27 January 2015 в 20:59
  • 5
    +1 Для просмотра вопроса и ответа на хороший дизайн. Сравнительно, «насколько велика ваша строка, прежде чем она ударит», в отличие от «если вам действительно нужно хранить много текста, используйте это ...». – StevoInco 26 February 2015 в 21:37
  • 6
    Но первые два бита используются для ASCII / не-ASCII-индикации, поскольку эта статья говорит, поэтому она должна быть 2 ^ 30 = 1 073 741 824 – Saito 10 February 2017 в 13:04
Другие вопросы по тегам:

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