加速Java应用程序

时间:2013-01-24 13:53:45

标签: java multithreading db2

如何加速Java应用程序?

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

如果要解析的文件更多,那么应用程序需要超过24小时才能完成,这是不可接受的。

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

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文件。

2 个答案:

答案 0 :(得分:7)

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

如果不衡量您的绩效瓶颈,就无法做出明智的决定。

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

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

  

实际上首先需要以适当的格式重写文件,然后阅读这些行&amp;提取必要的数据,甚至为单个文件读取2-3次源行(实际上这是逻辑部分)。当我在4000K文件上运行应用程序时,它运行24小时。

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

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

注意:使用更多线程不会使您的硬盘更快。

答案 1 :(得分:1)

你正在打电话

thread.run();

而不是

thread.start();

这意味着您实际上并没有在单独的线程中运行代码......

除此之外,我想要回答@ Peter的回答。