将少量数据附加到大型XML文件的最有效方法是什么?

时间:2016-08-15 10:58:10

标签: java apache-commons stax

我的程序每天运行一次并收集大约300kB,这是HTPP GET请求的结果。它将此数据保存到新的XML文件(daily.xml)中并将其发布到数据库。

我还想要逐步添加archive.xml的大型6GB + XML文件(daily.xml)。为了全面了解,我的XML Schema如下所示。

<?xml version="1.0" ?><add>
    <doc>...</doc>
    <doc>...</doc>
    <doc>...</doc></add>

注意我在新行上分隔了<doc>个元素,但真实文件的所有内容都在一行上(对于下面的选项2很重要):

我知道StAX无法“修改”XML文件。所以似乎可以使用以下选项:

1。继续使用StAX,并使用临时“合并”文件

我可以将所有6GB + 300 kB写入临时文件并重命名。也就是说,为了保持XML的完整性,我可以使用StAX来读取和组合archive.xmldaily.xml并写入archive.temp.xml,然后重命名为archive.xml以覆盖旧文件。

为了添加~300kB,本能地复制大文件本身效率低下。更不用说它在磁盘空间上非常昂贵,例如短时间内需要大约2x6GB的空间。

2。忽略StAX实现并恢复为文件的字符串操作

这包括以下几个步骤:

  • 找到根元素
  • 使用字符串工具浏览文件并删除尾根元素。它不会像删除最后一行那么简单,因为文件只有一行。
  • 使用BufferedWriter或nio2等效项在APPEND模式下打开文件,例如: FileChannel并添加daily.xml
  • 编写尾根元素</add>并关闭文件

    第二个项目符号,打开文件并查找/删除尾根元素似乎并不高效。

第3。使用字符串操作和RandomAccessFile

Java有一个RandomAccessFile类,允许我通过放置光标来修改archive.xml。将需要与上述类似的步骤,例如,我需要找到尾随根元素并插入每日文本。

这是一个本地类,所以我不知道它在没有构建测试的情况下效率如何,但是搜索结果使它看起来像是一种操作大文件的相当低效的方法(即它很慢)。

这样做是否有共同的做法?文本编辑器如何做同样的事情?

0 个答案:

没有答案