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 mySailRepository = new SailRepository(new MemoryStore(tempDir)); //로컬의 RDF파일을 이용해 Repository생성
HTTPRepository를 이용
주력으로 밀고있는 HTTPRepository를 이용하는 방법을 알아보죠.
- Sesame server 설치방법
- http://www.openrdf.org/download.jsp
- Sesame 2.0 beta releases를 다운 (tar나 zip을 다운받는다.)
- 압축 해제
- openrdf-sesame-2.0-beta6/war/에 두개의 war파일이 존재
- openrdf-sesame.war : Sesame서버 역할, Sesame 엔진의 상태를 확인할 수 있음
- openrdf-workbench.war : Sesame클라이언트 역할, 서버 선택, 트리플 Modify, Query, Explore, Extract
- openrdf-sesame.war를 Tomcat/webapps에 복사
- (이름이 길다싶으면 "openrdf-sesame.war" --> "server.war" 라고 바꾸셔도 되고요)
- 서버실행
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메모리를 올리셔야합니다.
전 Heap Memory를 1024m바꿔줬습니다. http://www.openrdf.org/doc/sesame/users/ch09.html#d0e3728를 참조하세요.
Sesame Server연결 - API 이용
rdf파일을 클라이언트에서 Sesame서버로 전달해보죠. 위에서 만든 코드에 몇줄 더해보겠습니다.
RepositoryConnection con = myRepository.getConnection(); //Connection가져 와서
con.add(new File("ontology.owl"), "http://bklab.snu.ac.kr/ontology", RDFFormat.RDFXML); //RDF파일 추가
이제 데이터를 가져와 보죠.
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)만드는 방법
위처럼 파라미터를 주면 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입니다. 모르는거죠.
결과를 보시면 _s : _p : _o(모든 트리플)을 찾아오는데 걸리는 시간은 데이터 양이 늘어갈수록 오래걸리는 것을 볼수 있습니다.
마무리
Sesame은 컨테이너의 메모리에 영향을 많이 받지만 온톨로지 정보를 컨테이너 메모리에 미리 올려두기 때문에 빠른 속도를 제공합니다. 일단 올라오라고~ ^^
제가 학부때에도 봤었던 건데 2.0으로 넘어오면서 더 충실해졌다는 느낌을 많이 받았습니다. 속도는 물론, 제공하는 API들도 말이죠. (지금도 그렇지만 그땐 지금보다 더 몰라서 그랬을수도. ㅋㅋ)
Repository로서의 역할을 잘 해낼수 있을것 같습니다.
헉 너무 충실한 벤치마크라서 내가 부끄러워지네. 마지막 결과에서 속도의 단위는 ms 겠지? , 음. all 에 대한 query 만 아니면, query 반응 속도의 증가율은 놀랍구나 activerdf 도 sesame 랑 연결은 되는데.. jruby 로 돌려야 하는 듯 해서 자세히 살펴보지는 않았지만. 한번 고려가 필요하겠네.
답글삭제@heechul - 2007/11/06 10:13
답글삭제응 ms야. 메모리에 올려 작업한거라 그런지 속도가 훈늉하지? ^^
activerdf연결도 가능할꺼야 sesame이 자체 model을 다른 포맷으로 바꾸기도 하니까.
뭐 지금은 안되더라도 나중엔...ㅋ
springnote에서 작성한거라 단락나눈게 다 깨지네. rpc도 안되고 copy&paste를 했다는...흑 블로그를 고쳐내라!!!
윽. 블로그를 나도 장기적으로 쓰기는 쓸꺼니까 한번 업그레이드 해야겠어.. 졸업논문 끝나고! ;;;
답글삭제@heechul - 2007/11/06 14:59
답글삭제거의 다 끝났지?^^ tistory에 올라온 태터툴즈 보니까 좋더라야~ㅋㅋ