java - 加速 Java 应用程序

标签 java multithreading db2

如何加速 Java 应用程序?

我正在开发一个 Java 应用程序,它逐行解析 Cobol 文件,从中提取必要的数据并填充到 DB2 数据库中。

如果有更多文件要解析,那么应用程序需要超过 24 小时才能完成,这是 Not Acceptable 。

所以我在一个单独的线程中做了一些表填充以加速......例如

ArrayList list = (ArrayList)vList.clone();
ThreadPopulator populator = new ThreadPopulator(connection, list, srcMbr);
Thread thread = new Thread(populator);
thread.run();
return;


And ThreadPopulator class is implementing Runnable interface and run method as

public void run()
{
    try
    {
        synchronized (this)
        {
           int len = Utils.length(list);
           for (int i = 0; i < len; i++)
           {
              .....
              stmt.addBatch();
            if ((i + 1) % 5000 == 0)
                    stmt.executeBatch(); // Execute every 5000 items.
           }
        }
    }
    catch (Throwable e)
    {
        e.printStackTrace():
    }
    finally
    {
        if (list != null)
            list.clear();
    }
}

注意:需要使用clone,这样下一个线程就不会消失条目。

我的思考方式是否正确?

请建议我,我必须选择什么方式来加速我的应用程序超过数千个 Cobol 文件。

最佳答案

您需要首先确定它花费大部分时间做什么。这需要测量 CPU 和可能的内存使用情况。是使用 CPU 的解析,还是使用 IO 的数据库。

如果不衡量您的性能瓶颈是什么,您就无法就需要改进的地方做出明智的决定。

根据我的经验,我会首先怀疑数据库。您的批量大小为 5000,这应该足够了。程序运行时使用了多少 CPU,例如一个 CPU 总是很忙吗?

注意:您可以编写一个简单的文本解析器来读取大约 40-100 MB/s。要运行 24 小时,您需要加载许多 TB 的数据,这听起来不太可能是原因。

Actually first need to rewrite the file in proper format then read those lines & extract necessary data, even source lines read by 2-3 times for a single file, (actually this is logic part). When I run the application on 4000K files, it runs for 24 hrs.

400 万个文件将是一个性能问题。对于快速硬盘,即使打开一个小文件也需要大约 8 毫秒,如果您每次打开它 2-3 次,总共需要大约 30 小时。 (我假设您的磁盘缓存可以为您节省几个小时)让它更快的唯一方法是;

  • 使用更少的文件。 400 万是一个多次打开的疯狂数字。每个打开一次大约需要 10 个小时(不要介意用它们做点什么)
  • 使用更快的驱动器,例如SSD 可以在大约 1/100 的时间内完成此操作。 HDD 可以执行高达 120 IOPS,便宜的 SSD 可以执行 40,000 IOPS,好的 SSD 可以执行 230,000 IOPS。后者可以在大约 12 秒内打开 400 万个文件,这比 10 小时还快。 ;)
  • 所有文件只传递一次。它仍然会很慢,但会快 2-3 倍。

注意:使用更多线程不会使您的硬盘驱动器运行得更快。

关于java - 加速 Java 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14502995/

相关文章:

java - xml 格式的 solr 响应

java - 防御性编程 : Guidelines in Java

sql - 在 IBM DB2 中选择列的子集

python - 使用 urllib.request 获取股票数据

sql - 删除前导零

mysql - 哪些 DBMS 提供索引组织表?

c# - 有哪些大型、模型丰富的开源应用程序?

java - Eclipse 深色主题与 .groovy 损坏?

c++ - 我必须运行 cmake 两次才能编译项目

c# - 以下静态方法线程安全吗?