2013-04-22 1 views
0

나는 상점 위치 데이터이며, 일부 점포는 1500 개 매장을 가지고 있으며 일부는 20,000 매장이확대됨에 필터링

일부 매장은 50 개 매장이 속성 복잡한 XML 객체의 그룹을 가지고 .

내가 자바의 목록을 만들려는 나를 매장 위치

가장 중요한 필터는 위도/경도 약 위도/경도 및 기타 데이터로 매장 위치를 ​​필터링 할 수있는 상점에 대한 개체; (40.146364, -75.406188)와 (40.228694, -75.491295) 사이의 모든 상점을 최대 및 최소 위도와 최대 및 최소 길이로 찾을 필요가 있습니다.

중복 위도/경도 값은 다음과 같습니다.

나는 내가 필터링하는 데 사용하는 몇 가지 주요 명시 적 특성을 가진 개체를 만들 거라고 생각 허용 (을 같은, 긴 저장 유형 코드 LAT)와 전체 XML의 문자열

나는 생각했다 오브젝트는 ArrayList 또는 다른 유형과 같은 Collection에 있으며 키는 Lat/long의 String입니다.

컬렉션을 신속하게 필터링하는 것이 중요합니다. 그것은 하루에 수백만 번 발생할 것입니다. 컬렉션 생성은 시작시 발생하며 필터가 빠르면 성능이 떨어질 수 있습니다.

위도/경도 필터는 매우 높은 특이성을 가지고 있습니다. 1500 개의 상점 위치를 갖는 한 예는 보통 50 개 이하의 상점 위치를 리턴합니다.

나는 Collection을 반복하고 lat/long 키를 파싱 할 수 있다고 생각했습니다. 위도/경도가 원하는 범위 내에 있으면 객체를 가져 와서 덜 구체적인 검색 기준을 필터링합니다.

쿼리 수가 많고 동일한 쿼리가 거의 반복되지 않기 때문에 데이터베이스를 직접 쿼리하는 것은 좋은 생각이 아닙니다. DB 캐싱은 각 쿼리의 매개 변수가 달라지기 때문에 발생하지 않습니다 (위도/경도는 소수점 이하 5 자리). 컬렉션을 통해 Chugging한다는 것은 DB에서 App 서버로로드를 이동시키는 것을 의미하지만 Oracle 라이센스 및 클러스터링은 많은 AWS 또는 Tomcat 인스턴스의로드 균형 조정보다 훨씬 비싸고 복잡합니다.

그룹의 구현에 대한 아이디어 요구 사항 및 제약 조건?

답변

0

당신이 말하는 숫자는 무서운 것이 아니며 메모리 내장 구현에서 적절한 성능을 기대합니다. 전체 객체 트리를 메모리에 저장할 수 없다면 적어도 현저한 정보 (lat/long + ids)를 저장하고 그것에 필터를 걸면됩니다.

성능을 결정하기 전에 먼저 솔루션을 구현할 것입니다.

+0

나는 당신이 설명한 것을 할 계획입니다. 내가 뭘 알고 싶습니다 사람이 무엇을 어떻게 향상시킬 것입니다 제안을 가지고 정보를 저장하려는 및 검색 기준과 일치하는 결과 집합을 필터링 할 수 있습니다 –

0

위도 - 경도 쿼리 때문에 데이터를 interval tree에 저장할 수 있습니다. Here is a Java implementation I found. 간단히 말해서, 간격 트리를 사용하면 간격을 쿼리하여 예를 들어 모든 개체를 빠르게 찾을 수 있습니다. x1과 x2 사이의 위도; y1과 y2 사이의 경도를 가진 객체와 이것을 교차 시키십시오.

+0

implementationm보고 후 난이 될 것이라고 확신하지 않습니다. 빠르며 좋지 않은 TreeMap을 사용합니다. b/c 동일한 위도/경도의 두 위치를 사용할 수 있습니다. –

+0

[TreeMultiMap] (http://google-collections.googlecode.com/)에 대한 TreeMap을 바꿀 수 있습니다. svn/trunk/javadoc/co.kr/google/common/collect/TreeMultimap.html) –