本文詳細介紹了將一個比較大的rdf文件裝載到virtuoso數據庫的過程。參考virtuoso網站的文檔說明,通過實踐,將一個大約4.6G左右的nt文件裝載到virtuoso數據庫中,用了大概6個多小時。參考網站:http://vos.openlinksw.com/owiki/wiki/VOS/VirtBulkRDFLoader
以下是具體的步驟。
一 准備條件
1 virtuoso的版本要求。Open source version 6.1.3以上或者commercial version 06.02.3129以上,這些版本有大文件裝載函數(方法)。
2 在virtuoso.ini中設置參數”DirsAllowed”,設置完成后需要重新啟動virtuoso。
參考:http://docs.openlinksw.com/virtuoso/dbadm/
參數設置的格式如下:
DirsAllowed = <path> [, <path>]
DirsDenied = <path> [, <path>]
<path> := <absolute_path> or <relative_path>
可以用下面的命令查看,在cmd中,進入bin目錄,然后運行isql,可以進入sql命令模式。
SQL> select server_root (), virtuoso_ini_path ();
上面的命令可以查看服務器的工作目錄和ini文件名稱。
用以下命令查看DirsAllowed參數的情況
SQL> select cfg_item_value (virtuoso_ini_path (), 'Parameters',
'DirsAllowed');
這一步,我沒有設置DirsAllowed,通過命令可以查看到vad目錄。
3 合理配置virtuoso.ini,保證有足夠的內存和其他系統資源。
參考:http://vos.openlinksw.com/owiki/wiki/VOS/VirtRDFPerformanceTuning
主要設置兩個參數,NumberOfBuffers 和 MaxDirtyBuffers。不同的系統內存對應設置不同的參數值。
如下表所示:
NumberOfBuffers? |
MaxDirtyBuffers? |
|
2 GB |
170000 |
130000 |
4 GB |
340000 |
250000 |
8 GB |
680000 |
500000 |
16 GB |
1360000 |
1000000 |
32 GB |
2720000 |
2000000 |
48 GB |
4000000 |
3000000 |
64 GB |
5450000 |
4000000 |
比如,我的系統是16G內存,就需要把對應的NumberOfBuffers設置為1360000, MaxDirtyBuffers設置為1000000。
4 文件格式要求。
Virtuoso只支持一下格式。
.grdf |
Geospatial RDF |
.nq |
|
.nt |
|
.owl |
|
.rdf |
|
.trig |
|
.ttl |
|
.xml |
二 大文件加載的過程
1 准備三個文件,放到vad目錄(也就是DirsAllowed的目錄)。一個是數據源文件,比如my_data.nt,一個是對應的圖文件,和數據源文件的名稱相同后面加.graph。比如my_data.nt.graph。一個是公共的圖文件,用來處理那些沒有對應的圖文件的數據源文件,名稱為global.graph。
標准格式:
<source-file>.<ext>
<source-file>.<ext>.graph
global.graph
舉例:
myfile.n3 ;; RDF data
myfile.n3.graph ;; Contains Graph IRI name into which RDF data from myfile.n3 will be loaded
global.graph ;; Contains Graph IRI name into which RDF data from any files that do not have a specific graph name file will be loaded
2 把圖的標識名(the graph IRI)寫到*.graph中。比如,圖的標識名為:http://dbpedia.org,把http://dbpedia.org寫到*.graph中。
3 注冊要加載的文件。使用isql,進入到SQL命令中,運行合適的方法。比如
SQL> ld_dir ('/path/to/files', '*.n3', 'http://dbpedia.org');
ld_dir() 里面的目錄不包括子目錄。ld_dir_all() 命令包括所有的子目錄。
4 用DB.DBA.load_list來查看注冊的數據集裝載情況和圖標識名正在加載還是已經加載。ll_state字段有三個值:0表示數據集還沒有加載;1表示數據集正在加載中;2表示數據集已經加載完成。如下所示
SQL> select * from DB.DBA.load_list;
ll_file ll_graph ll_state ll_started ll_done ll_host ll_work_time ll_error
VARCHAR NOT NULL VARCHAR INTEGER TIMESTAMP TIMESTAMP INTEGER INTEGER VARCHAR
_____________________________________________________________________________________________________________________________
./dump/d1/file1.n3 http://file1 2 2010.10.20 9:21.18 0 2010.10.20 9:21.18 0 0 NULL NULL
./dump/d2/file2.n3 http://file2 2 2010.10.20 9:21.18 0 2010.10.20 9:21.18 0 0 NULL NULL
./dump/file.n3 http://file 2 2010.10.20 9:21.18 0 2010.10.20 9:21.18 0 0 NULL NULL
3 Rows. -- 1 msec.
SQL>
5 最后,通過rdf_loader_run()命令完成大文件數據的加載。
命令如下:
SQL> rdf_loader_run();
該命令執行后,如果文件比較大,會是一個漫長的等待過程,耐心等待,可以先不管他,做其他的工作去吧。
漫長等待之后,如果裝載成功,會有一個花費時間的顯示。
如果查看導入情況,可以另外打開一個cmd,然后進入isql,鍵入select * from DB.DBA.load_list;,可以查看導入正在進行(ll_state值為1),還是導入完成(ll_state值為2)。
通過以上操作,就可以完成數據的加載。
導入完成之后,需要清理一下load_list,否則下次裝載其他文件時,load_list里面的文件還會導入。清理命令是delete from db.dba.load_list;。