【问题标题】:How to process large no of xml files and write into text file in java faster如何处理大量的xml文件并更快地写入java中的文本文件
【发布时间】:2017-10-25 15:25:46
【问题描述】:

我一天有数百万个 xml 文件。 xml 文件的大小从 10KB 到 50 MB。

我已经编写了 SAX 解析器来解析 xml 文件并写入文本文件。 我正在从数百万个 xml 文件中创建 35 个独特的文本文件。 我必须以先到先的基本方式解析这些 xml 文件,以便保持记录的顺序。

我必须非常快地处理文件。

xml 文件的总大小约为 1 TB。 我还没有实现多线程来处理 xml 文件,因为我必须以先到先的方式处理它。

如何快速处理所有的xml文件?

在将我的代码移动到 prod 之前,我只是想检查一下我是否需要重新考虑我的实现。

这就是我读取 xml 文件并处理它的方式。

public static void main(String[] args) {
        File folder = new File("c://temp//SDIFILES");

        File[] files = folder.listFiles();

        Arrays.sort(files, new Comparator<Object>() {
            public int compare(Object o1, Object o2) {

                if (((File) o1).lastModified() > ((File) o2).lastModified()) {
                    return -1;
                } else if (((File) o1).lastModified() < ((File) o2).lastModified()) {
                    return +1;
                } else {
                    return 0;
                }
            }

        });

        for (File file : files) {
            System.out.println("Started Processing file :" + Arrays.asList(file));
            new MySaxParser(file);
        }

    }

我不确定我的处理是否适用于数百万个 xml 文件。

【问题讨论】:

  • 考虑学习 XSLT?
  • 您应该在Codereview 中提出这个问题。它们可以帮助您更好地改进代码。
  • @ThorbjørnRavnAndersen 现在我们无法更改实现...
  • @ThorbjørnRavnAndersen 我们可以使用大数据 mapreduce 来处理吗..会有帮助吗?

标签: java xml sax


【解决方案1】:

正如你所说,你必须按照先到先得的原则处理它。 你可以把每个xml文件看成一个java方法,然后你可以实现多线程来处理xml文件。我认为这样可以节省很多时间。

【讨论】:

  • 我没有把每个xml文件都当成java方法?
  • 使用像mapreduce这样的大数据处理会有帮助吗?
【解决方案2】:

马上:

return Long.compareTo(((File) o1).lastModified(), ((File) o2).lastModified());
  • 读写缓冲
  • 小心字符串操作
  • 没有验证
  • 对于 DTD,使用 XML 目录
  • 使用分析器! (在 Excel 生成中救了我)
  • 如果可能,使用数据库而不是 35 个输出文件
  • 检查 RAM 磁盘等
  • 当然有很多内存-Xmx

最后的手段,XML 拉解析器 (StaX) i.o。 Xalan/Xerces 或纯文本解析,是你试图阻止的;所以不予置评。

Arrays.sort(files, new Comparator<File>() {
        @Override
        public int compare(File o1, File o2) {
            return Long.compareTo(o1.lastModified(), o2.lastModified());
        }
    });

【讨论】:

  • 我要考虑的事情太多了..我应该优化多少时间?请您在我的代码中进行编辑
  • 使用map reduce之类的大数据怎么样
  • 用 BufferedInputStream 包装 InputStream 不需要成本。从网上读取 DTD(如果有的话)可能会很昂贵。探查器是一种技术,但确实很有帮助,尝试找到瓶颈,进行优化。使所有工作都可验证和指导。
  • 大数据也需要结构化工作。我当然会从 XML 开始。像大数据提供的并发性可能会或可能不会产生一个大因素或一个小因素。为此,必须首先存在一个处理模型。
【解决方案3】:

有很多事情需要考虑...

  1. 当所有文件都已经存在于c://temp//SDIFILES 文件夹中时,这是一个批处理过程,还是一种等待下一个文件出现在那里的事件侦听器?

  2. 您有所有这些 XML 的 XSD 架构吗?如果是这样,您可能会考虑预先使用 JAXB 解组器而不是自定义 SAX 解析器

恕我直言...

  1. 如果是批处理 - 将解析过程与将结果合并到文本文件中分开。然后,您可以通过使用一些临时/阶段文件/对象在将它们放入文本文件之前应用多线程来解析文件。 即

    • 在资源允许的情况下运行尽可能多的解析线程(内存/cpu)
    • 将每个解析器结果放在临时文件/数据库/内存映射等中。 它的订单号或时间戳
    • 将准备好的结果合并到文本文件中,作为整个过程的最后一步。因此,您不会等待仅在前一个解析时才解析下一个 XML 文件。
  2. 如果它是一个监听器,它也可以使用多线程来解析,但可能需要的更多。例如,定期将结果合并到文本文件中(例如每 10 秒一次),这将选择标记为就绪的临时结果文件

无论如何,这两种情况都是“分割过程”。 假设您可以为按时间戳文件列表排序的接下来的 5 个文件运行 5 个解析线程,然后等到所有 5 个解析线程完成(结果可能不需要临时文件,但如果可能的话可以留在内存中),然后组合成文本文件。 ...然后选择接下来的 5 个文件,依此类推...

...类似的东西...

当然,大量文件需要时间的顺序处理,主要是从 XML 中解析它们。

【讨论】:

  • 无论如何,主要的一点是将解析与聚合分开,并为结果提供一个订单号/时间戳,以便正确聚合(先到先)到生成的文本文件中。
  • 我不是在聚合它,我只是一个一个地解析它并将其写入文本文件。每次写入不同的文本文件会使进程更快地附加到一个文件吗?
  • h-m-m...您实际上是在聚合。如果您有数百万个输入文件并且结果只有 35 个文本文件,那么它就是聚合。 :-) 仍然主要的时间消耗是解析过程。您可以通过多线程加速。顺便说一句,通过分离过程,您也可以通过为最终文本文件运行 35 个聚合线程来加快附加过程。解析结果准备好后,您可以将其传递给适当的文本文件附加线程...只是一个...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-04
  • 1970-01-01
  • 2020-01-14
  • 2010-11-06
  • 2018-06-05
相关资源
最近更新 更多