Ошибка «Недостаточно памяти» при загрузке больших файлов

У меня были проблемы с загрузкой больших файлов на мой сервер Trace.

Я загружаю как Multipart/form-data и извлекаю файл из запроса, используя FileUploadSupport scalatra (как показано ниже)

class foo extends ScalatraServlet with FileUploadSupport {
  configureMultipartHandling(MultipartConfig(maxFileSize = Some(1073741824)))
  post("/upload") {
    //{1}
    ... //(VALIDATION AND USER LOGIN WITH SCENTRY)
    ... //(Transactionally posts meta info to Elasticsearch and writes video to filesystem)
  }
}

У меня есть батарея тестов, и у меня нет проблем с запуском файлов меньшего размера ~ 50 МБ и даже файлов размером 3-400 МБ, если сервер работает на локальном хосте.

Однако, когда я размещаю свой сервер на удаленной машине, у меня возникают некоторые специфические проблемы с транспортом. И (при отладке) я никогда не достигаю точки останова в {1}

Исследуя проблему, я нашел это, что предполагает повторное использование одного и того же http-соединения, которое может быть причиной проблемы. Следуя их совету, я добавил в свой сервлет следующее, и, проанализировав заголовки ответов, я могу подтвердить, что это «принято»:

before("/*") {
  response.addHeader("Connection", "close")
}

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

Эта загрузка происходит через https (если это уместно) с сертификатом, подписанным CA, и принимается Google Chrome как безопасное, частное соединение.

При настройке соединителя сервера я изменил значение тайм-аута простоя на случай, если это вызывало какие-либо проблемы.

httpsConnector.setIdleTimeout(300000)

Несмотря на эти модификации, мне еще предстоит решить эту проблему, и я ценю любые ваши советы.

РЕДАКТИРОВАТЬ1-РЕШЕНО-

Я полагал, что уже выделил 4 ГБ пространства кучи, и поэтому это была незначительная ошибка. Оказывается, версия, которую я запускал на локальном хосте, была через Intellij, у которой есть свои представления о размере кучи.

при запуске его на удаленной машине с помощью «sbt run» я забыл включить опцию fork в свой build.scala. следовательно, sbt проигнорировал мои параметры jvm (предположительно, не может установить параметры на работающем jvm), и я работал с кучей 300 МБ.


person Richard    schedule 15.11.2015    source источник
comment
Ваш MultipartConfig должен указывать location, чтобы файлы записываются/читаются из этого места на вашем локальном диске (таким образом, не требуется память для хранения всего содержимого файла).   -  person Joakim Erdfelt    schedule 15.11.2015
comment
Спасибо, я внес это изменение, а также исправил размер кучи.   -  person Richard    schedule 15.11.2015


Ответы (1)


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

Вы пытались увеличить размер кучи. В этом разница между вашим удаленным и локальным сервером?

person S V    schedule 15.11.2015
comment
Привет, спасибо за ваш ответ. Я полагал, что уже выделил 4 ГБ пространства кучи, и поэтому это была незначительная ошибка. Оказывается, версия, которую я запускал на локальном хосте, была через Intellij, у которой есть свои представления о размере кучи. Запустив его на удаленной машине с помощью sbt run, я забыл включить опцию fork в свой build.scala. Следовательно, sbt проигнорировал мои параметры jvm, и я работал с кучей 300 МБ. - person Richard; 15.11.2015
comment
Приятно знать, что ваша проблема решена! Примите мой ответ. - person S V; 15.11.2015