OpenRDF - Sesame Benchmark

사용자 삽입 이미지

Sesame은 RDF데이터를 처리(쿼리, 추론, 저장)하는 Open Framework입니다. 여러 모듈들이 합쳐저 있지만 그 중에서 단연 밀고있는건 Htttp통신을 이용한 RDF데이터 전달이 아닌가 싶습니다.

Sesame 내부에는 openrdf-sail이나 openrdf-rio등과 같은 수많은 모듈들이 사용되는데 http://www.aduna-software.org에서 Open소스로 관리되고 있습니다. 살펴보면 쓸만 한 API들이 꽤 됩니다.

아래 그림처럼 HTTP를 이용해서 RDF데이터를 주고 받습니다. 각각의 컴포넌트들은 모듈별로 관리되고 있습니다. (http://www.aduna-software.org/projects 뭐 가도 많은 정보는 없네요. ^^)

사용자 삽입 이미지

Repository 는 SailRepository와 HTTPRepository가 있는데요. SailRepository는 독립적인 Repository를 만들수 있게 해주고 HttpRepository는 원격에 있는 Repository의 Connection을 가져와 처리할 수있게 합니다.

Repository myRepository = new HTTPRepository("http://localhost:8080/sesame_server", repositoryID); //원격에 있는 서버 연결
Repository mySailRepository = new SailRepository(new MemoryStore(tempDir)); //로컬의 RDF파일을 이용해 Repository생성

HTTPRepository를 이용

주력으로 밀고있는 HTTPRepository를 이용하는 방법을 알아보죠.

  1. Sesame server 설치방법
    • http://www.openrdf.org/download.jsp
    • Sesame 2.0 beta releases를 다운 (tar나 zip을 다운받는다.)
  2. 압축 해제
    • openrdf-sesame-2.0-beta6/war/에 두개의  war파일이 존재
    • openrdf-sesame.war : Sesame서버 역할, Sesame 엔진의 상태를 확인할 수 있음
    • openrdf-workbench.war : Sesame클라이언트 역할, 서버 선택, 트리플 Modify, Query, Explore, Extract
  3. openrdf-sesame.war를 Tomcat/webapps에 복사
    • (이름이 길다싶으면 "openrdf-sesame.war" --> "server.war" 라고 바꾸셔도 되고요)
  4. 서버실행

http://localhost:8080/openrdf-sesame/system/overview.view 로 접속 하면 서버의 정보를 확인할 수 있습니다.

사용자 삽입 이미지

보시면 Data directory에서 rdf 데이터가 저장되는 위치를 알 수 있죠. (정확히 말하면 *.rdf파일이 저장되는 건 아니고 독자적인 파일 형태로 변환되어 저장되는겁니다.) 물리적인 위치를 말하죠.

Memory정보를 보시면 Maximum , Used, Maximum 부분이 있죠. 서버에 RDF를 로딩하면 나름의 파일 형태로 만들어 변환해두고 나중에 Tomcat서버가 다시 로딩될때 그 파일을 tomcat heap메모리에 올리게 되죠, Maximum, Used는 heap메모리에 올라가 있는 데이터 량 정보입니다.

로딩될때 미리 올리는거죠. 그래서 속도는 꽤 나옵니다. 용량이 좀 큰 데이터를 올리실때는 Tomcat Heap메모리를 올리셔야합니다.

CATALINA_OPTS="-Xmx1024m"

전 Heap Memory를 1024m바꿔줬습니다. http://www.openrdf.org/doc/sesame/users/ch09.html#d0e3728를 참조하세요.


Sesame Server연결 - API 이용

rdf파일을 클라이언트에서 Sesame서버로 전달해보죠. 위에서 만든 코드에 몇줄 더해보겠습니다.

Repository myRepository = new HTTPRepository("http://localhost:8080/sesame_server", repositoryID); //원격에 있는 서버 연결하고
RepositoryConnection con = myRepository.getConnection(); //Connection가져 와서
con.add(new File("ontology.owl"), "http://bklab.snu.ac.kr/ontology", RDFFormat.RDFXML); //RDF파일 추가

이제 데이터를 가져와 보죠.

ValueFactory f = myRepository.getValueFactory(); //Value Factory를 만들고

URI s = f.createURI("http://www.Department0.University0.edu/AssistantProfessor0"); //Value Factory를 통해 URI를 만들어 주고
URI p = f.createURI("http://www.w3.org/1999/02/22-rdf-syntax-ns#type");
URI o = f.createURI("http://bklab.snu.ac.kr/ontology#AssistantProfessor");

RepositoryResult<Statement> stmtResult = con.getStatements(s, p, o, true); s-p-o를 갖는 stmt를 반환케 하죠.

while(stmtResult.hasNext()){
  System.out.println(stmtResult.next());

Sesame은 SeRQL(Sesame RDF Query Language - 써클이라고 읽는답니다.)과 SPARQL을 지원합니다. http://www.openrdf.org/doc/sesame2/2.0-beta6/users/ch08.html#d0e691


Sesame Server연결 - Workbench 이용

이번엔 API를 이용한 프로그램이 아닌 sesame에서 제공하는 Workbench를 이용해 보겠습니다.

openrdf-sesame-2.0-beta6/war/openrdf-workbench.war을 webapps에 복사합니다.

http://localhost:8080/openrdf-workbench 로 접속한 후 Server를 선택해줘야합니다. 위에서 war파일을 꿔서 Context가 바뀌였다면 바뀐 경로로 넣어야 합니다.

사용자 삽입 이미지


서버를 등록했으면 왼쪽메뉴에서 새로운 rdf파일 업로드, 검색, 삭제등의 작업을 수행할 수 있습니다.

사용자 삽입 이미지


대용량 테스트

대용량 RDF 로딩 테스트

LUBM의 Data Generator를 이용해서 만들어진 온톨로지 파일을 로딩하는데 걸리는 속도를 체크해봤습니다. LBUM은 Ontology Repository를 평가하기 위해서 만들어졌는데 몇가지 테스트 컴포넌트로 구성되어 있습니다. 그 중 Data Generator는 온톨로지를 랜덤하게 만들어줍니다.


LUBM(1,0)만드는 방법

java edu.lehigh.swat.bench.uba.Generator -univ 1 -seed 0 -onto http://bklab.snu.ac.kr/ontology

위처럼 파라미터를 주면 15개의 owl파일과 1개의 info파일 이 생성됩니다. 파라미터를 달리하면서 (5,0)~(50,0)까지를 만들면 각각 93, 189, 402, 999개의 owl파일을 뿜어 냅니다. ^^

이렇게 만들어진 다수의 온톨로지 파일들을 Loop돌면서 HttpRepository의 Connection에 추가한 속도를 체크해봤습니다.

아래와 같은 로딩 속도 결과를 얻었어요. LUBM(50,0)의 로딩시간인 129,922,582ms를 시간으로 환산하니 36.0896061시간이네요. 헉헉;;

사용자 삽입 이미지

각 LUBM의 파일 크기는 *.rdf파일이 아닌 로딩이 완료되었을 때, 위쪽 서버정보의 Data directory에 위치한 실제 파일사이즈입니다. Data directory를 찾아가면 RDF파일 대신 바이너리 파일을 찾을 수 있습니다.

데이터의 양이 많아 질수록 평균로딩시간이 줄어드네요. 제생각엔 양이 커질수록 온톨로지 내의 재사용되는(다른 resource들과 연결되는) resource들이 많아져서 그런것 같습니다. 나중에 기회가 되면 확인해 봐야 겠네요.


대용량 RDF Triple검색속도 테스트

검 색속도 테스트도 LUBM의 테스트셋 (1,0)~(50,0)까지의 파일들을 사용했습니다. 온톨로지의  triple검색을 할때 아무래도 "광섭이 직업이 무엇이냐?" 처럼 SPO의 O에 해당하는 질문을 많이 하게되겠지요. 물론 트리플표현을 하는 온톨로지의 말투을 빌리면 "광섭이 - 직업을가지고있다 - 프로그래머"가 되겠네요.

"광섭이 - 직업이 -   _X"

"_X        - 직업이 -  학생"

"광섭이 -    _X     -   _Y" 등등

이런식으로 패턴을 나눠 속도를 체크해봤습니다. _는  anonymous입니다. 모르는거죠.


사용자 삽입 이미지

(ms/반환개수)

결과를 보시면 _s : _p : _o(모든 트리플)을 찾아오는데 걸리는 시간은 데이터 양이 늘어갈수록 오래걸리는 것을 볼수 있습니다.

마무리

Sesame은 컨테이너의 메모리에 영향을 많이 받지만 온톨로지 정보를 컨테이너 메모리에 미리 올려두기 때문에 빠른 속도를 제공합니다. 일단 올라오라고~ ^^

제가 학부때에도 봤었던 건데 2.0으로 넘어오면서 더 충실해졌다는 느낌을 많이 받았습니다. 속도는 물론, 제공하는 API들도 말이죠. (지금도 그렇지만 그땐 지금보다 더 몰라서 그랬을수도. ㅋㅋ)

Repository로서의 역할을 잘 해낼수 있을것 같습니다.




댓글

  1. 헉 너무 충실한 벤치마크라서 내가 부끄러워지네. 마지막 결과에서 속도의 단위는 ms 겠지? , 음. all 에 대한 query 만 아니면, query 반응 속도의 증가율은 놀랍구나 activerdf 도 sesame 랑 연결은 되는데.. jruby 로 돌려야 하는 듯 해서 자세히 살펴보지는 않았지만. 한번 고려가 필요하겠네.

    답글삭제
  2. @heechul - 2007/11/06 10:13
    응 ms야. 메모리에 올려 작업한거라 그런지 속도가 훈늉하지? ^^

    activerdf연결도 가능할꺼야 sesame이 자체 model을 다른 포맷으로 바꾸기도 하니까.

    뭐 지금은 안되더라도 나중엔...ㅋ



    springnote에서 작성한거라 단락나눈게 다 깨지네. rpc도 안되고 copy&paste를 했다는...흑 블로그를 고쳐내라!!!

    답글삭제
  3. 윽. 블로그를 나도 장기적으로 쓰기는 쓸꺼니까 한번 업그레이드 해야겠어.. 졸업논문 끝나고! ;;;

    답글삭제
  4. @heechul - 2007/11/06 14:59
    거의 다 끝났지?^^ tistory에 올라온 태터툴즈 보니까 좋더라야~ㅋㅋ

    답글삭제

댓글 쓰기

이 블로그의 인기 게시물

Protopage.com

Android, MediaPlayer IllegalStateException 상황