2014-10-24 3 views
3

Похоже, что мы попали в ошибку в RCurl. Метод getURL, похоже, вызывает утечку памяти. Простой тест для воспроизведения ошибки приведен здесь:Ошибка утечки RCurl в методе getURL

library(RCurl) 
handle<-getCurlHandle() 
range<-1:100 
for (r in range) {x<-getURL(url="news.google.com.au",curl=handle)} 

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

Мы используем RCURL для некоторых длительных экспериментов, и у нас заканчивается память в тестовой системе.

спецификации нашей тестовой системы заключаются в следующем:

ОС: Ubuntu 14.04 (64 бит)

памяти: 24 GB

RCurl версия: 1.95-4.3

Любые идеи о том, как обойти эту проблему?

Спасибо

+0

Grab [источник] (http://cran.r-project.org/src/contrib/RCurl_1.95-4.3.tar.gz) захватить [последнюю библиотеку curl] (http://curl.haxx.se/) , протестируйте его с помощью [valgrind] (http://valgrind.org/) и отправьте патч (будучи серьезным, это сообщество разработало sof tware) – hrbrmstr

+1

Мы обнаружили некоторые незначительные утечки в RCurl в прошлом. Мы свяжемся и поработаем с Дунканом, чтобы решить эти проблемы. –

ответ

3

Я посмотрю на это. Однако посмотрите, есть ли проблема getURLContent(), то есть замените getURL() на getURLContent(). Функция getURLContent() - это более богатая версия getURL() и одна, которая получает больше внимания.

+0

Спасибо Дункан. Я попробую getURLContent и посмотрю, решит ли он проблему. – deadlift

+1

Выполнение теста с использованием getURLContent не показывает увеличения объема памяти. Включит его в фактическое приложение в понедельник и отметит ваш пост как ответ, если все будет хорошо. Спасибо Дункан. – deadlift

1

Я просто ударил это тоже, и сделал следующие изменения кода для работы вокруг него:

ТРАВИТ (Старый код)

h = basicHeaderGatherer() 
tmp = tryCatch(getURL(url = url, 
         headerfunction = h$update, 
         useragent = R.version.string, 
         timeout = timeout_secs), 
       error = function(x) { .__curlError <<- TRUE; __curlErrorMessage <<- x$message }) 

NO УТЕЧКИ (Новый код)

method <- "GET" 
h <- basicHeaderGatherer() 
t <- basicTextGatherer() 
tmp <- tryCatch(curlPerform(url = url, 
          customrequest = method, 
          writefunction = t$update, 
          headerfunction = h$update, 
          useragent=R.version.string, 
          verbose = FALSE, 
          timeout = timeout_secs), 
       error = function(x) { .__curlError <<- TRUE; .__curlErrorMessage <<- x$message }) 
Смежные вопросы