【问题标题】:Java: Read 10,000 excel files and write to 1 master file in Java using Apache POIJava:使用 Apache POI 读取 10,000 个 excel 文件并写入 1 个 Java 主文件
【发布时间】:2018-09-06 23:27:35
【问题描述】:

我在 Google 中进行了搜索,但找不到下面提到的问题的正确答案。如果这是一个重复的问题,请原谅我,但我找不到任何正确的答案。

所以,来回答这个问题。我必须在 Java 中读取多个 Excel 文件并从这些多个文件中生成最终的 Excel 报告文件。

有2个文件夹:

  1. 源文件夹:包含多个 Excel 文件(大概 10,000 个文件)

  2. 目标文件夹:从源文件夹中读取所有文件后,此文件夹将包含一个最终的 Master Excel 文件。

对于从 Source 文件夹中读取的每个 Excel 文件,Destination 文件夹中的主文件将各有 1 行。

我打算使用 Apache POI 在 Java 中读写 excel 文件。

我知道使用 POI 在 Java 中读取和写入文件很容易,但我的问题是,在这种情况下,有近 10,000 个文件要读取和写入到 1 个单个主文件中,最好的方法是什么? ,考虑到程序所花费的时间和使用的 CPU。一次读取 1 个文件将非常耗时。

所以,我计划使用线程一次处理 100 个文件的批次。谁能指点我一些资源或建议我如何处理此要求?

已编辑:

我已经编写了使用 POI 读写文件的程序。下面提到了相同的代码:

        // Loop through the directory, fetching each file.
    File sourceDir = new File("SourceFolder");
    System.out.println("The current directory is = "+sourceDir);

    if(sourceDir.exists()) {
        if(sourceDir.isDirectory()){
            String[] filesInsideThisDir = sourceDir.list();
            numberOfFiles = filesInsideThisDir.length;
            for(String filename : filesInsideThisDir){
                System.out.println("(processFiles) The file name to read is = "+filename);

                // Read each file
                readExcelFile(filename);

                // Write the data
                writeMasterReport();
            }
        } else {
            System.out.println("(processFiles) Source directory specified is not a directory.");
        }
    } else {
    }

这里,SourceFolder 包含所有要读取的 Excel 文件。我正在遍历这个文件夹,一次获取 1 个文件,读取内容,然后写入 1 个 Master Excel 文件。

readExcelFile() 方法正在读取每个 excel 文件,并创建一个 List,其中包含要写入 Master excel 文件的每一行的数据。

writeMasterReport() 方法正在写入从每个 excel 文件中读取的数据。

程序运行良好。我的问题是,有什么方法可以通过使用 Threads 读取文件来优化此代码?我知道只有 1 个文件可以写入,并且不能并行完成。如果 sourceFolder 包含 10,000 个文件,那么这种方式的读写会花费很多时间来执行。

每个输入文件的大小约为几百 KB。

所以,我的问题是,我们可以使用线程批量读取文件,比如每个线程 100 或 500 个文件,然后为每个线程写入数据吗?我知道写入部分需要同步。这样至少可以最小化读写时间。请让我知道您对此的看法。

【问题讨论】:

  • 如果您真的遇到性能问题,请先尝试并返回。不要过早优化。
  • “我打算使用线程来分批处理文件,比如一次 100 个文件。”然后从所有这些线程写入一个目标工作簿?不可能,请参阅FAQ 20. Can I access/modify workbooks/documents/slideshows in multiple threads?
  • 您需要多长时间处理这些文件?我猜你不需要“立即”完成它。有时只需一个接一个地浏览它们就足够了。
  • lexicore 是对的,多线程可能会使应用程序不必要地复杂化,并且处理时间的改进可能不值得。你应该首先尝试用一个线程解决这个问题,看看时间是否满足。然后您可以尝试转换您的代码以支持多个线程。这些excel文件有多大?如果它们大约只有几 mbs,那么它很可能不值得。
  • “对于从Source文件夹中读取的每个Excel文件,Destination文件夹中的主文件将各有1行。”:然后首先收集POJOs的List中的行。这可以是多线程的。然后在一个线程中从 List 编写目标工作簿。

标签: java excel multithreading apache-poi


【解决方案1】:

10k 个文件,每个文件约 100Kb,我们正在谈论读取 ca. ~1Gb 的数据。如果处理不是过于复杂(看起来如此),那么您的瓶颈将是 IO。

因此并行读取和处理文件很可能没有意义,因为 IO 有上限。
如果处理复杂/瓶颈,并行化将是有意义的。这里好像不是这样。

【讨论】:

  • "处理文件作为 IO 有上限。" - 你能解释一下吗?
  • @user1302909 由于文件在磁盘上,读取这些文件会受到磁盘读取速度的限制。假设使用“普通”SSD 驱动器,您的读取速度可能约为 0.5Gb/s (source)。 Tests 表示并行读取并不比串行读取 256x512Kb 文件快多少(仅 25% 左右)。它受驱动器读取速度的限制。
  • @user1302909 你也受到你的写作速度的限制。不管理论上你读起来有多快,同步时的写入不会给你带来太多的性能优势。
猜你喜欢
  • 1970-01-01
  • 2014-12-05
  • 1970-01-01
  • 2015-06-30
  • 2020-12-16
  • 1970-01-01
  • 1970-01-01
  • 2017-03-25
  • 1970-01-01
相关资源
最近更新 更多