将数百万个XML文件插入BaseX

3

能否将一百万个记录(XML文件)存储到Basex数据库中?

for(int j=1;j<1000000;j++) {
     String id=String.valueOf(j);
     String[] elems={"firstname","lastname","nickname","salary","permanentAddress","currentAddress","contactNo","email","alternateMail","FacebookName","Color"};
     String[] childs = {id,"yong"+id,"mook kim"+id,"mkyong"+id,"100000"+id,"Bhopal"+id,"pune"+id,"999999999"+id ,"test"+id+"@basex.com","testA"+id+"@basex.com","Tom"+id,"grey"+id};

    try {
        xmlFile= x.CreateXMLDoc("test","transperfect",elems,childs);
    } catch (TransformerConfigurationException exception) { 
        exception.printStackTrace(); 
    }

    storeIntoBaseXDB(j,id,xmlFile);         
}

//StoreIntoBaseXDB方法

public static void storeIntoBaseXDB(int i, String id, String xmlFile) throws BaseXException {

    if(i==1)
    {   
        System.out.println("=========================Store into Database=========================");


        //System.out.println("Check database existence");
        con.getDatabaseConnection(dbNmae);
        con.executeInsertQuery(dbNmae,id,xmlFile);
    }
    else
    {
        con.executeInsertQuery(dbNmae,id,xmlFile);

    }
}

//executeInsertQuery() method

          public long executeInsertQuery(String dbname,String id,String xmlFile) throws BaseXException
    {

           //System.out.println(path);
            new Open(dbname).execute(context);



            try 
            {


                /* String query = "db:add('db','C:/Users/manish/Desktop/BaseX65/xml/books.xml')";
                 QueryProcessor proc = new QueryProcessor(query, context);
                    proc.execute();
                    proc.close();
                    context.close();*/

                new Add(id,xmlFile).execute(context);

                //System.out.println(new Find(id));


            }

            catch (Exception e)
            {
                System.out.println("ERROR executing query: ");
                e.printStackTrace();
            } 

}

2个回答

2
是的,这是可能的。为什么不呢(一百万是相对较小的数字)?
限制是2^29,即546,870,912(存储的XML文档数)。
XML元素的限制是2^31,即2,147,483,648(尽管这包括所有节点,包括属性、文本等)。
这是一个关于BaseX统计信息的网页,其中包含现有数据库示例的第一行也包含了限制(#Files表示存储的XML文档数,#Nodes表示XML节点数,如元素、属性、文本等): http://docs.basex.org/wiki/Statistics

2

除了@icza提供的BaseX正确统计数据的答案,我想补充一些内容:

文件数、节点数等的上限始终适用于每个数据库。这意味着您可以简单地创建另一个数据库来规避这些限制。在许多情况下,将大型数据库拆分成几个小型数据库甚至可能更有利,因为锁定是在数据库级别上进行的,即如果您有一个大型数据库并进行写操作,则会锁定所有内容。如果将其拆分为几个数据库,则只会锁定较小的部分。

由于XQuery可以轻松访问多个数据库,因此可以在查询中轻松合并拆分的数据库。


你们说得没错。但是当我尝试使用Java中的新add()方法(例如new Add(id,xmlFile).execute(context);)存储一百万条记录时,它需要太长时间,甚至不能确保记录已被存储。而且,当我尝试通过命令提示符在BaseX数据库中查看XML文件时,它会给出错误:“正在更新数据库'Trans',或更新未完成。”那么有没有快速存储一百万条记录的方法呢? - manish payasi
你应该编辑你的问题并展示适当的代码片段(例如storeIntoBaseXDB),因为你当前的片段实际上与此无关。另外,“太长时间”是什么意思,多长时间算太长(插入一百万个文档显然需要一些时间)。此外,正如我在SO和我们的邮件列表中多次告诉你的那样:使用XQuery Update而不是首先将文件序列化并写入磁盘很可能会更快。 - dirkk
我无法确定需要多长时间,因为当我尝试存储 100,000 条记录时,需要大约一个小时,所以我无法预测一百万(1,000,000)条记录需要多长时间。 - manish payasi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接