【问题标题】:inserting millions of xml files into basex将数百万个 xml 文件插入 basex
【发布时间】:2014-08-04 07:45:18
【问题描述】:

是否可以将一百万条记录(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) 抛出 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);

    }
}

//执行InsertQuery()方法

          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();
            } 

}

【问题讨论】:

    标签: java xml basex


    【解决方案1】:

    是的,这是可能的。为什么不呢(一百万是一个相对较小的数字)?

    限制为 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 中使用 new add() 方法(如 new Add(id,xmlFile).execute(context); )存储一百万条记录时,即使不能确保记录已存储,也需要很长时间.它给出了错误错误:“数据库'Trans'正在更新,或更新未完成。”当我试图通过命令提示符查看 BaseX 数据库中的 xml 文件时。那么有没有什么方法可以快速存储上百万条记录呢?
      • 好吧,您绝对应该编辑您的问题并显示适当的代码 sn-ps(例如 storeIntoBaseXDB),因为您当前的 sn-p 实际上与它无关。另外,“太长时间”是什么意思,多长时间太长(插入一百万个文档显然需要一些时间)。此外,正如我现在多次告诉你的那样(在 SO 和我们的邮件列表中):使用 XQuery 更新可能会更快,而不是先将文件序列化并写入磁盘。
      • 我不能说需要多长时间,因为当我尝试存储 100,000 条记录时,大约需要一个小时,所以我无法预测一百万(1,000,000)条记录。跨度>
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-22
      • 2020-03-16
      • 1970-01-01
      • 2013-11-27
      • 2023-01-31
      • 2011-08-22
      相关资源
      最近更新 更多