如何加速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文件。
答案 0 :(得分:7)
您需要先确定花费大部分时间做什么。这需要测量CPU和可能的内存使用情况。它是使用CPU的解析,还是使用IO的数据库。
如果不衡量您的绩效瓶颈,就无法做出明智的决定。
根据我的经验,我会先怀疑数据库。批量大小为5000,应该足够了。程序运行时使用多少CPU,例如一个CPU总是忙吗?
注意:您可以编写一个简单的文本解析器来读取大约40-100 MB / s。要运行24小时,您需要加载大量TB数据,这听起来不太可能。
实际上首先需要以适当的格式重写文件,然后阅读这些行&amp;提取必要的数据,甚至为单个文件读取2-3次源行(实际上这是逻辑部分)。当我在4000K文件上运行应用程序时,它运行24小时。
400万个文件将成为性能问题。对于快速硬盘而言,即使是一个简单的文件打开也需要大约8毫秒,如果你打开2-3次,它总共需要大约30个小时。 (我假设您的磁盘缓存可以节省几个小时)使速度更快的唯一方法是:
注意:使用更多线程不会使您的硬盘更快。
答案 1 :(得分:1)
你正在打电话
thread.run();
而不是
thread.start();
这意味着您实际上并没有在单独的线程中运行代码......
除此之外,我想要回答@ Peter的回答。