2013-04-26 2 views
0

Я работаю над проблемами скорости с помощью текущего метода, который находит определенную совокупность атрибутов в пределах ArrayList. В зависимости от размера для поиска значения в списке может потребоваться больше 7 секунд.Grails: ArrayList - скорость поиска

Мне нужно ускорить этот процесс, поэтому я могу иметь дело с большими объемами данных. Будем очень благодарны любой помощи. Вот мой пример;

Метод:

public ArrayList getIntegrationTag(String attribute) { 
    return crmMapping?.findAll { it.get("ATTRIBUTE") == attribute }?.collect{ 
    it.INTEGRATION_TAG 
    }?.unique() 
}//end getIntegrationTag(String attribute) 

содержание crmMapping

«[{ПРИЗНАК = AcademicIndex, INTEGRATION_TAG = Контакт ~ nAcademic_Index}, {ПРИЗНАК = AcademicInterest, INTEGRATION_TAG = Контакт ~ msplAcademic_Interest} , ........] "

+0

Почему коллекция должна быть такой большой? Предполагая, что 'crmMapping' очень большой. – Bart

+0

Это относительно большой (более 10 000 символов). Он содержит всю информацию о сопоставлении полей для импорта данных в нашу систему Oracle CRM с использованием веб-служб. –

ответ

1

findВсе петли над каждой записью, затем собирают петли над каждой записью, а затем повторяют новые петли над каждой записью.

Try ...

Set result = [] as Set 

for(element in crmMapping) { 
    if(element.get("ATTRIBUTE") == attribute) { 
    result << element.INTEGRATION_TAG 
    } 
} 

return (result as ArrayList) 

Это только цикл, как только он будет уникален, как он был добавлен в набор

+0

Благодарим за отзыв. Я не хотел никого обижать, но не отвечал до понедельника; очевидно, что есть проблема с моим доступом к VPN. Я очень ценю помощь, и я попробую ответить на ваши и @ crudolf в понедельник; –

+0

Это решение занимает ~ 1/5 времени по сравнению с исходным кодом, и его было просто реализовать. Дополнительная информация о # циклах была очень проницательной и высоко оценена. –

0

Выполните следующие действия один раз

def crmMappingMap = crmMapping.groupBy({ it.ATTRIBUTE }) 

Тогда у вас есть карта всех же случаях атрибутов и доступ к нему с помощью crmMappingMap[attribute].INTEGRATION_TAG, который будет возвращать нужный массив, например:

public ArrayList getIntegrationTag(String attribute) { 
    crmMappingMap[attribute].INTEGRATION_TAG.unique() 
} 

Всегда держите карту , то скорость доступа будет достаточно быстрой.

+0

Благодарим за отзыв. Я не хотел никого обижать, но не отвечал до понедельника; очевидно, что есть проблема с моим доступом к VPN. Я очень ценю помощь, и я попробую ответить на ваши и @ crudolf в понедельник; –

+0

Еще раз спасибо за ответ. Ваш метод работает хорошо, а также экономит время на исходный код. Я попытался повысить вашу репутацию, но пока у меня нет 15 очков, поэтому я вернусь позже и добавлю. –

Смежные вопросы