Превышение пределов памяти в стандарте GAE [дубликат]

SetArray - лучшее решение, но оно недоступно для многих старых драйверов. Следующий способ обхода может быть использован в java8

String baseQuery ="SELECT my_column FROM my_table where search_column IN (%s)"

String markersString = inputArray.stream().map(e -> "?").collect(joining(","));
String sqlQuery = String.format(baseSQL, markersString);

//Now create Prepared Statement and use loop to Set entries
int index=1;

for (String input : inputArray) {
     preparedStatement.setString(index++, input);
}

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

22
задан poolie 13 June 2015 в 00:37
поделиться

2 ответа

«Предел мягкой частной памяти» - это предел памяти, при котором App Engine остановит экземпляр от получения большего количества запросов, дождитесь появления каких-либо невыполненных запросов и прекратит экземпляр. Подумайте об этом как о грациозном отключении, когда вы используете слишком много памяти.

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

21
ответ дан Anand Mistry 16 August 2018 в 00:04
поделиться

Предполагаю, что вы используете внешний интерфейс внешнего интерфейса или бэкэнд. (Класс F1 или B1) Оба имеют квоту памяти 128 МБ, поэтому ваше приложение, скорее всего, преодолело этот лимит квоты. Тем не менее, эта квота, как представляется, не строго соблюдается, и Google имеет некоторую снисходительность к этому (таким образом, термин soft limit), у меня было несколько экземпляров приложения F1, потребляющих ~ 200 МБ памяти за несколько минут до того, как они были завершены приложением Engine.

Попробуйте увеличить класс экземпляра до следующего класса более высокого уровня (F2 или B2), который имеет квоту на 256 МБ памяти и посмотреть, не произойдет ли повторная ошибка. Кроме того, изучите, воспроизводится ли ошибка при каждом отправке электронной почты с помощью вложений. Поскольку возможно, что то, что вы видите, является симптомом, но не причиной, а часть вашего приложения, которая потребляет много памяти, находится где-то в другом месте.

20
ответ дан Ibrahim Arief 16 August 2018 в 00:04
поделиться
  • 1
    Я использую экземпляр самого низкого класса - это хороший вызов для увеличения предела памяти. Я попробую прикрепить что-то большое, выбрав более высокий экземпляр. – user714852 18 February 2012 в 01:41
  • 2
    Также не забудьте обновить бэкэнды. Мне кажется, AppEngine запускает B1 по умолчанию. Попробуйте: appcfg.py. обновления (см. также: groups.google.com/forum/?fromgroups = #! topic / google-appengine / & hellip; ) – Vladimir Obrizan 3 January 2013 в 13:34
  • 3
    Для меня это звучит так, как будто происходит утечка памяти, и экземпляр в GAE не освобождает память должным образом. – Jonny 12 May 2014 в 06:07
  • 4
    Ибрагим, вы сказали (в комментарии к OP): AFAIK, the process was allowed to finish its last request before being terminated. – Ibrahim Arief Feb 17 '12 at 23:15 означает ли это в этом случае, письмо, вероятно, было успешно отправлено? Может быть, пользователь user714852 мог бы ответить? – The Red Pea 18 October 2015 в 19:46
  • 5
    @TheRedPea Вероятно, да. Это поведение не зарегистрировано Google. (и по уважительной причине они могут захотеть изменить его в любой момент времени). Это также зависит от того, насколько тяжелым является процесс, если он занял много времени, чтобы закончить, тогда GAE может принять решение о насильственном прекращении действия экземпляра. – Ibrahim Arief 19 October 2015 в 08:01
Другие вопросы по тегам:

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