【问题标题】:Object Creation during loops循环期间的对象创建
【发布时间】: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


    【解决方案1】:

    解决了这个问题。这实际上不是休眠问题,而是内存管理问题。见解决方案here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-29
      • 2015-02-23
      • 2016-11-11
      • 1970-01-01
      • 1970-01-01
      • 2020-08-08
      • 2015-02-04
      相关资源
      最近更新 更多