【发布时间】:2014-03-04 02:33:27
【问题描述】:
我在使用 Hibernate 时遇到了一些性能问题,我被卡住了。
我有一个嵌套的 foreach,它首先遍历一个映射,然后遍历映射中的每个键以创建一个对象。
for(Map<String, Object> csvRow : csvRows){
Contact contact = new Contact();
contact.setContactId(nextContactId);
for(String key : csvRow.keySet())
{
contact.setDetails(key, csvRow.get(key));
contactList.addContact(contact);
}
nextContactId++;
}
我的问题在于上面的代码需要大约 10 秒才能运行。这是一个大约 2MB 的 CSV 输入,但该服务必须有效地处理 200MB(至少)的文件。 我被卡住的原因是下面的代码运行大约 1.6 秒,但只创建了一个 Contact 对象的实例(这很公平),我明白为什么会发生这种情况。
Contact contact = new Contact();
for(Map<String, Object> csvRow : csvRows){
contact.setContactId(nextContactId);
for(String key : csvRow.keySet())
{
contact.setDetails(key, csvRow.get(key));
contactList.addContact(contact);
}
nextContactId++;
}
我尝试了一些常见的方法,例如在每次处理键的迭代期间手动将对象的 id 设置为 null。只是为了让事情更清楚,联系人对象不应该代表一个完整的人,而是代表一个联系人的一条信息。每个联系人都有相同的contactId,并且我有一个包装对象将它们联系在一起,但这与我的问题无关。
因此,我的问题是:如何在创建我需要的所有对象的同时保持后者的性能。此外,我需要保留我拥有的对象结构,因为我无法控制可能缺少左右和中心数据的源 CSV,因此我正在使用的对象结构。如果您需要更多信息,我热切期待您的回复。
编辑 #1:使用 Hibernate 4.2.8、Spring 3.2.6
【问题讨论】:
标签: java performance object memory-management