Первый вызов к конечной точке обновления 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, вы должны устранить длительную задержку при первом обновлении.