我一天有数百万的xml文件。 xml文件的大小从10KB到50MB。
我编写了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文件。
答案 0 :(得分:0)
正如你所说,你必须先到先得。 您可以将每个xml文件视为java方法,然后您可以实现多线程来处理xml文件。我认为这样可以节省大量时间。
答案 1 :(得分:0)
立即:
return Long.compareTo(((File) o1).lastModified(), ((File) o2).lastModified());
最后的手段,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());
}
});
答案 2 :(得分:0)
有很多事情需要考虑......
当c://temp//SDIFILES
文件夹中已存在所有文件或者它是一种等待下一个文件出现在那里的事件监听器时,它是批处理吗?
您是否拥有所有这些XML的XSD架构?如果是这样,您可能会考虑使用JAXB unmarshaller而不是自定义SAX解析器
如果是批处理 - 将解析过程与将结果合并到文本文件中分开。然后,您可以通过使用一些临时/阶段文件/对象来应用多线程来解析文件,然后再将它们放入文本文件中。 即
如果它是一个监听器,它也可以使用多线程进行解析,但可能需要更多。例如,定期将结果合并到文本文件中(例如每10秒一次),这将选择标记为就绪的临时结果文件
无论如何,对于这两种情况,它将是&#34;分配过程&#34;。 假设您可以按照时间戳文件列表排序,为接下来的5个文件运行5个解析线程,然后等待所有5个解析线程完成(结果可能不是临时文件,但如果可能,可以保留在内存中),然后组合进入文本文件。 ...然后选择接下来的5个文件等等......
...类似的东西......
当然,大量文件需要花费一些时间的顺序进程,主要是从XML解析它们。