2013-04-26 5 views
0

현재 작업ArrayList 내에서 특정 속성 컬렉션을 찾는 작업과 관련된 속도 문제를 해결하고 있습니다. 크기에 따라 목록에서 값을 찾는 데 7 초 이상 걸릴 수 있습니다.Grails : ArrayList - Retrieval Speed ​​

이 프로세스의 속도를 높여야하므로 더 많은 양의 데이터를 처리 할 수 ​​있습니다. 어떤 도움이라도 대단히 감사하겠습니다. 여기에 내 예가있다.

방법 :

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

crmMapping 내용

"[{ATTRIBUTE = AcademicIndex, INTEGRATION_TAG = 연락 ~ nAcademic_Index}, {ATTRIBUTE = AcademicInterest, INTEGRATION_TAG = 연락 ~ msplAcademic_Interest} , ........] "

+0

왜 컬렉션이 큰 것을 할 필요가 않습니다에 추가로이가 한 번만 루프는 고유 한 것입니까? 'crmMapping'이 매우 크다고 가정합니다. – Bart

+0

비교적 큽니다 (1 만 자 이상). 여기에는 웹 서비스를 사용하여 Oracle CRM 시스템으로 데이터를 가져 오기위한 모든 필드 매핑 정보가 들어 있습니다. –

답변

1

각 레코드에 대해 findAll이 반복되면 각 레코드에 대해 collect 루프가 반복되고 각 레코드에 대해 고유 한 루프가 다시 수행됩니다.

시도 ...

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
public ArrayList getIntegrationTag(String attribute) { 
    crmMappingMap[attribute].INTEGRATION_TAG.unique() 
} 

항상지도를 계속 : 10 그럼 당신은 모든 동일한 속성 인스턴스의지도를 가지고 다음과 같이 원하는 배열을 반환하는 crmMappingMap[attribute].INTEGRATION_TAG를 사용하여 액세스 할 수있는

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

번 다음을 수행 , 액세스 속도가 빠를 것입니다.

+0

응답 해 주셔서 감사합니다. 나는 누군가를 불쾌하게하고 싶지 않았지만 월요일까지 응답하지 않았다. 분명히 내 VPN 액세스에 문제가 있습니다. 나는 정말로 도움에 감사 드리며 나는 월요일에 너와 @ crudolf의 대답을 모두 시도 할 것이다. –

+0

응답 해 주셔서 다시 한 번 감사드립니다. 귀하의 방법은 잘 작동하고 원본 코드보다 시간을 절약 할 수 있습니다. 나는 당신의 명성을 올리려고 애썼지 만, 아직 15 포인트를 얻지 못했고, 그래서 나는 나중에 다시 돌아와 그것을 추가 할 것입니다. –