Первый вызов к конечной точке обновления openrdf-sesame очень медленный. Есть ли способ оптимизировать его?

У нас есть несколько сценариев Python для выполнения запросов sparql и "обновлений" (вставка / удаление). Вот большая часть соответствующего кода (я думаю):

server = "localhost"
repo = "test"
query_endpoint  = "http://%s:8080/openrdf-sesame/repositories/%s" % (server,repo)
update_endpoint = "http://%s:8080/openrdf-sesame/repositories/%s/statements" % (server,repo)


def execute_query(query):
  params = { 'query': query }
  headers = {
    'content-type': 'application/x-www-form-urlencoded',
    'accept': 'application/sparql-results+json'
  }
  (response, content) = httplib2.Http().request(endpoint, 'POST', urllib.urlencode(params),headers=headers)
  return (response,ast.literal_eval(content))

def execute_update(query):
  params = { 'update': query }
  headers = {
    'content-type': 'application/x-www-form-urlencoded',
    'accept': 'application/sparql-results+json'
  }
  (response, content) = httplib2.Http().request(update_endpoint, 'POST', urllib.urlencode(params),headers=headers)
  return True

Все наши вызовы execute_query выполняются очень быстро, менее чем за 1 секунду. Однако любой вызов execute_update занимает очень много времени (16 секунд) в первый раз. Каждый звонок после первого выполняется менее чем за 1 секунду. Мы работаем с сезамовой версией 2.7.12 (мы думали, что обновление с сезамовой версии 2.7.3 может помочь, но это не так уж и много). У нас всего 2 или 3 тысячи троек. Все это выполняется из сценариев CGI, поэтому мы не можем просто поддерживать сеанс Python в живых, чтобы делать вызовы обновления (в любом случае, разве не работа этого рабочего места?). Любые идеи о том, что занимает так много времени на этот первый вызов update_endpoint? У других людей есть такая же проблема? Любые предлагаемые решения?

Спасибо!

РЕДАКТИРОВАТЬ Я последовал совету RobV, но у меня все еще есть та же проблема. Файлы журнала от tshark:

 22.577578   10.10.2.43 -> 10.10.2.43   HTTP POST /openrdf-sesame/repositories/test HTTP/1.1 
 22.578261   10.10.2.43 -> 10.10.2.43   HTTP Continuation or non-HTTP traffic
 22.583422   10.10.2.43 -> 10.10.2.43   HTTP HTTP/1.1 200 OK  (application/sparql-results+json)
 22.583857   10.10.2.43 -> 10.10.2.43   HTTP Continuation or non-HTTP traffic
 22.591122   10.10.2.43 -> 10.10.2.43   HTTP POST /openrdf-sesame/repositories/test/statements HTTP/1.1 
 22.591388   10.10.2.43 -> 10.10.2.43   HTTP Continuation or non-HTTP traffic
 35.020398   10.10.2.43 -> 10.10.2.43   HTTP HTTP/1.1 204 No Content 
 35.025605   10.10.2.43 -> 10.10.2.43   HTTP POST /openrdf-sesame/repositories/test/statements HTTP/1.1 
 35.025911   10.10.2.43 -> 10.10.2.43   HTTP Continuation or non-HTTP traffic
 35.040606   10.10.2.43 -> 10.10.2.43   HTTP HTTP/1.1 204 No Content 
 35.045937   10.10.2.43 -> 10.10.2.43   HTTP POST /openrdf-sesame/repositories/test/statements HTTP/1.1 
 35.046080   10.10.2.43 -> 10.10.2.43   HTTP Continuation or non-HTTP traffic
 35.049359   10.10.2.43 -> 10.10.2.43   HTTP HTTP/1.1 204 No Content 
 35.053776   10.10.2.43 -> 10.10.2.43   HTTP POST /openrdf-sesame/repositories/test/statements HTTP/1.1 
 35.053875   10.10.2.43 -> 10.10.2.43   HTTP Continuation or non-HTTP traffic
 35.056937   10.10.2.43 -> 10.10.2.43   HTTP HTTP/1.1 204 No Content 

Вы можете увидеть большой разрыв при первом обращении к конечной точке операторов /.

2 ответа

Решение

Когда мы создали репозиторий, мы создали его как репозиторий "In Memory Store". Я создал новый репозиторий типа "Native Java Store", и теперь мой первый вызов быстрый (так как все последующие вызовы).

Рабочая среда Sesame и сервер - это два разных приложения, работающие в разных контекстах приложения в контейнере вашего веб-приложения.

Ваш CGI-код направляет запросы непосредственно на сервер Sesame, но направляет обновления в рабочую среду Sesame.

Sesame workbench на самом деле является просто пользовательским интерфейсом для сервера Sesame и по существу передает ваши запросы на базовый сервер Sesame. Когда вы в первый раз делаете обновление, Workbench должен установить соединение с сервером, которое, как мне кажется, включает в себя различные дополнительные запросы к метаданным на сервере Sesame. После этого соединение кэшируется рабочей средой, поэтому последующие обновления выполняются очень быстро.

Обновления могут быть направлены непосредственно на сервер Сезам, изменив конечную точку обновления для использования сервера Сезам /statements конечная точка вместо этого, как описано в документации к протоколу Sesame HTTP, например

update_endpoint = "http://%s:8080/openrdf-sesame/repositories/%s/statements" % (server,repo)

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

Другие вопросы по тегам