[JAVA] HTML 파싱 병렬 처리

Seokjun Moon·2023년 9월 14일
0

HTML 파싱이 너무 오래 걸린다.

java로 파싱할 경우, 건당 평균 1000ms 정도가 소요된다. 서비스에 5건만 보여준다고 해도, 텍스트 파싱에만 5초를 사용하기에는 너무 긴 시간이다! 그래서 다른 라이브러리를 찾아보고 있지만, 자바 안에서 최대한의 성능을 뽑기 위해서 우선 병렬 처리를 해보기로 했다.

코드

병렬처리는 간단하다! .stream().parallel() 만 해주면 끝!!

public class TextExtractor {
    public static List<TextExtractResponse> executeWithNaver(KeywordSearchRequest request) throws Exception {
        List<SearchResponse> searchResponses = NaverSearcher.execute(request);
        List<TextExtractResponse> result = new ArrayList<>();

        StopWatch totalTime = new StopWatch();
        totalTime.start();

        searchResponses.stream().parallel().forEach(searchResponse -> {
            try {
                String [] splits = searchResponse.link().split("/");
                String postId = splits[splits.length - 1];
                String postURL = "http://blog.naver.com/PostView.naver?blogId=" + searchResponse.blogId() + "&logNo=" +  postId;
                Connection connection = Jsoup.connect(postURL);
                Document document = connection.get();

                Elements items = document.select("#post-view" + postId  + " > div > div > div.se-main-container");

                if (items.size() == 0) {
                    items = document.select("#post-view" + postId  + " > div > div.se-main-container");
                }

                StringBuilder text = new StringBuilder();
                items.forEach(item -> {
                    text.append(item.text());
                });

                result.add(
                        new TextExtractResponse(
                                searchResponse.link(),
                                text.toString()
                        )
                );


            }
            catch (Exception exception) {
                exception.printStackTrace();
            }
        });

        totalTime.stop();
        System.out.println("Text Extracting Total Time : " + totalTime.getTotalTimeMillis() + "ms");

        return result;
    }
}

이렇게 작성하면 끝 !!!

성능 테스트

1차 테스트

1차 테스트는 기존 코드에 병렬처리만 추가하여 진행했다. "금정구 맛집" 을 키워드로 네이버 API를 이용해서 검색을 진행하였다.

중간에 한번씩 1초정도 걸리긴 했으나, 평균 800ms대의 응답속도를 보여주었다. 마지막에는 최대 725ms로 빠르면 0.7초 정도로 나쁘지 않은 속도. 하지만 조금 모자라다 !! 더어어 빨라야 하기 때문에 html element를 파싱할 때, selector가 아닌 xpath를 이용해보았다.

2차 테스트

jsoup의 selectXpath 메서드를 이용했다.

7번의 테스트를 진행했는데, 2번정도 1초 혹은 그 이상의 시간이 소요되었으나, 평균적으로 700ms의 응답속도를 보여주었다.

결론

병렬처리로 시간을 확 줄였으나! CPU 사용량이 높아지긴 한다. m2 맥북에어 기준 약 50% 정도의 CPU 사용량을 찍고 다시 내려오긴 하지만 ..

그래도 텍스트 파싱하는 속도가 700초대로 줄인 것은 꽤나 성공적! 이라고 할 수 있지만 여전히 느리다 .... 더 빠른 방법을 찾아봐야할듯

profile
차근차근 천천히

0개의 댓글